

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

# Buka CSV SerDe untuk memproses CSV
<a name="csv-serde"></a>

Gunakan CSV Terbuka SerDe untuk membuat tabel Athena dari data yang dipisahkan koma (CSV) data.

## Nama pustaka serialisasi
<a name="csv-serde-library-name"></a>

Nama pustaka serialisasi untuk Open CSV SerDe adalah. `org.apache.hadoop.hive.serde2.OpenCSVSerde` Untuk informasi kode sumber, lihat [CSV SerDe](https://cwiki.apache.org/confluence/display/Hive/CSV+Serde) di dokumentasi Apache.

## Menggunakan CSV Terbuka SerDe
<a name="csv-serde-using"></a>

Untuk menggunakan ini SerDe, tentukan nama kelas yang sepenuhnya memenuhi syarat setelahnya`ROW FORMAT SERDE`. Juga tentukan pembatas di dalamnya`SERDEPROPERTIES`, seperti pada contoh berikut.

```
...
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
WITH SERDEPROPERTIES (
  "separatorChar" = ",",
  "quoteChar"     = "`",
  "escapeChar"    = "\\"
)
```

### Abaikan header
<a name="csv-serde-opencsvserde-ignoring-headers"></a>

Untuk mengabaikan header dalam data Anda ketika Anda mendefinisikan tabel, Anda dapat menggunakan properti `skip.header.line.count` tabel, seperti pada contoh berikut.

```
TBLPROPERTIES ("skip.header.line.count"="1")
```

Sebagai contoh, lihat `CREATE TABLE` pernyataan di [Kueri log aliran VPC Amazon](vpc-flow-logs.md) dan[Kueri CloudFront log Amazon](cloudfront-logs.md).

### Menggunakan NULL untuk data yang tidak valid
<a name="csv-serde-opencsvserde-using-null"></a>

Untuk menggunakan nilai NULL untuk data yang gagal deserialisasi ke dalam tipe kolom yang ditentukan, Anda dapat menggunakan properti `use.null.for.invalid.data` tabel, seperti yang ditunjukkan pada contoh berikut. 

```
TBLPROPERTIES ("skip.header.line.count"="1")
```

**penting**  
Pengaturan `use.null.for.invalid.data` ke `TRUE` dapat menyebabkan hasil yang salah atau tidak terduga karena `NULL` nilai menggantikan data yang tidak valid di kolom dengan ketidakcocokan skema. Kami menyarankan Anda memperbaiki data dalam file atau skema tabel Anda daripada mengaktifkan properti ini. Saat Anda mengaktifkan properti ini, kueri tidak akan gagal pada data yang tidak valid, yang dapat mencegah Anda menemukan masalah kualitas data.

### Pertimbangan untuk data string
<a name="csv-serde-opencsvserde-considerations-string"></a>

CSV Terbuka SerDe memiliki karakteristik berikut untuk data string:
+ Menggunakan tanda kutip ganda (`"`) sebagai karakter kutipan default, dan memungkinkan Anda menentukan karakter pemisah, kutipan, dan pelarian, seperti: 

  ```
  WITH SERDEPROPERTIES ("separatorChar" = ",", "quoteChar" = "`", "escapeChar" = "\\" )
  ```
+ Anda tidak dapat melarikan diri `\t` atau `\n` secara langsung. Untuk melarikan diri dari mereka, gunakan`"escapeChar" = "\\"`. Sebagai contoh, lihat [Example: Escaping \t or \n](#csv-serde-opencsvserde-example-escaping-t-or-n).
+ CSV Terbuka SerDe tidak mendukung jeda baris yang disematkan dalam file CSV.

### Pertimbangan untuk data non-string
<a name="csv-serde-opencsvserde-considerations-non-string"></a>

Untuk tipe data selain`STRING`, CSV Terbuka SerDe berperilaku sebagai berikut:
+ Mengenali`BOOLEAN`,`BIGINT`,`INT`, dan tipe `DOUBLE` data. 
+ Tidak mengenali nilai kosong atau nol dalam kolom yang didefinisikan sebagai tipe data numerik, meninggalkannya sebagai. `string` Salah satu solusinya adalah membuat kolom dengan nilai nol sebagai `string` dan kemudian digunakan `CAST` untuk mengonversi bidang dalam kueri menjadi tipe data numerik, memberikan nilai default untuk nol. `0` Untuk informasi lebih lanjut, lihat [Ketika saya menanyakan data CSV di Athena, saya mendapatkan kesalahan HIVE\$1BAD\$1DATA: Error parsing field value in the](https://aws.amazon.com/premiumsupport/knowledge-center/athena-hive-bad-data-error-csv/) Knowledge Center. AWS 
+ Untuk kolom yang ditentukan dengan tipe `timestamp` data dalam `CREATE TABLE` pernyataan Anda, mengenali `TIMESTAMP` data jika ditentukan dalam format numerik UNIX dalam milidetik, seperti. `1579059880000` Sebagai contoh, lihat [Example: Using the TIMESTAMP type and DATE type specified in the UNIX numeric format](#csv-serde-opencsvserde-example-timestamp-unix).
  + CSV Terbuka SerDe tidak mendukung `TIMESTAMP` dalam `java.sql.Timestamp` format yang sesuai dengan JDBC, seperti `"YYYY-MM-DD HH:MM:SS.fffffffff"` (presisi tempat desimal 9).
+ Untuk kolom yang ditentukan dengan tipe `DATE` data dalam `CREATE TABLE` pernyataan Anda, kenali nilai sebagai tanggal jika nilai mewakili jumlah hari yang telah berlalu sejak 1 Januari 1970. Misalnya, nilai `18276` dalam kolom dengan tipe `date` data dirender seperti `2020-01-15` saat ditanyakan. Dalam format UNIX ini, setiap hari dianggap memiliki 86.400 detik.
  + CSV Terbuka SerDe tidak mendukung `DATE` dalam format lain apa pun secara langsung. Untuk memproses data stempel waktu dalam format lain, Anda dapat menentukan kolom sebagai `string` dan kemudian menggunakan fungsi konversi waktu untuk mengembalikan hasil yang diinginkan dalam kueri Anda`SELECT`. [Untuk informasi lebih lanjut, lihat artikel [Saat saya menanyakan tabel di Amazon Athena, hasil TIMESTAMP kosong di pusat](https://aws.amazon.com/premiumsupport/knowledge-center/query-table-athena-timestamp-empty/) pengetahuan.AWS](https://aws.amazon.com/premiumsupport/knowledge-center/)
+ Untuk mengonversi kolom lebih lanjut ke jenis yang diinginkan dalam tabel, Anda dapat [membuat tampilan](views.md) di atas tabel dan menggunakannya `CAST` untuk mengonversi ke jenis yang diinginkan.

## Contoh
<a name="csv-serde-opencsvserde-examples"></a>

**Example Contoh: Menanyakan data CSV sederhana**  
Contoh berikut mengasumsikan Anda memiliki data CSV yang disimpan di lokasi `s3://amzn-s3-demo-bucket/mycsv/` dengan konten berikut:  

```
"a1","a2","a3","a4"
"1","2","abc","def"
"a","a1","abc3","ab4"
```
Gunakan `CREATE TABLE` pernyataan untuk membuat tabel Athena berdasarkan data. Referensi `OpenCSVSerde` (perhatikan “d” dalam huruf kecil) setelah `ROW FORMAT SERDE` dan tentukan pemisah karakter, karakter kutipan, dan karakter escape di`WITH SERDEPROPERTIES`, seperti pada contoh berikut.  

```
CREATE EXTERNAL TABLE myopencsvtable (
   col1 string,
   col2 string,
   col3 string,
   col4 string
)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
WITH SERDEPROPERTIES (
   'separatorChar' = ',',
   'quoteChar' = '"',
   'escapeChar' = '\\'
   )
STORED AS TEXTFILE
LOCATION 's3://amzn-s3-demo-bucket/mycsv/';
```
Kueri semua nilai dalam tabel:  

```
SELECT * FROM myopencsvtable;
```
Query mengembalikan nilai-nilai berikut:  

```
col1     col2    col3    col4
-----------------------------
a1       a2      a3      a4
1        2       abc     def
a        a1      abc3    ab4
```

**Example Contoh: Menggunakan tipe TIMESTAMP dan tipe DATE yang ditentukan dalam format numerik UNIX**  
Pertimbangkan tiga kolom berikut dari data yang dipisahkan koma. Nilai-nilai di setiap kolom diapit tanda kutip ganda.  

```
"unixvalue creationdate 18276 creationdatetime 1579059880000","18276","1579059880000"
```
Pernyataan berikut membuat tabel di Athena dari lokasi bucket Amazon S3 yang ditentukan.  

```
CREATE EXTERNAL TABLE IF NOT EXISTS testtimestamp1(
 `profile_id` string,
 `creationdate` date,
 `creationdatetime` timestamp
 )
 ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
 LOCATION 's3://amzn-s3-demo-bucket'
```
Selanjutnya, jalankan query berikut:   

```
SELECT * FROM testtimestamp1
```
Query mengembalikan hasil sebagai berikut, menunjukkan tanggal dan waktu data:  

```
profile_id                                                        creationdate     creationdatetime
unixvalue creationdate 18276 creationdatetime 1579146280000       2020-01-15       2020-01-15 03:44:40.000
```

**Example Contoh: Melarikan diri\$1 t atau\$1n**  
Pertimbangkan data uji berikut:  

```
" \\t\\t\\n 123 \\t\\t\\n ",abc
" 456 ",xyz
```
Pernyataan berikut membuat tabel di Athena, menentukan itu. `"escapeChar" = "\\"`   

```
CREATE EXTERNAL TABLE test1 (
f1 string,
s2 string) 
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde' 
WITH SERDEPROPERTIES ("separatorChar" = ",", "escapeChar" = "\\") 
LOCATION 's3://amzn-s3-demo-bucket/dataset/test1/'
```
Selanjutnya, jalankan query berikut:   

```
SELECT * FROM test1;
```
Ia mengembalikan hasil ini, melarikan diri dengan benar `\t` atau`\n`:  

```
f1            s2
\t\t\n 123 \t\t\n            abc
456                          xyz
```