0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Athena, Redshift Spectrum で CSV 読み込む時の注意点

Last updated at Posted at 2022-12-12

概要

CSV の読み込みには以下があるが、2重引用符内に , を含むデータがある場合は要注意。

  1. Glue Crawler を利用する
  2. Athena, Redshift Spectrum から DDL で外部テーブル定義を行う

問題点

Glue Crawler を利用して csv から Glue カタログにテーブルを作成する際は、デフォルトで LazySimpleSerDe が使われる。しかし、以下のような落とし穴があるので注意する。

LazySimpleSerDe は データ内に引用符で囲まれた値がない場合は、この SerDe を使用します。

とのことで、以下のようなデータが CSV ファイルに存在すると適切にデータを読み込むことができません。

sample.csv
column_a,column_b
abc,1000
def,"2,000"

クエリ結果 (Redshift Spectrum からのクエリ結果)
以下のように、適切に読み込まれない。
image.png

対応

以下の対応を検討しましょう。

  1. OpenCSV Serde で DDL を書く
  2. CSV を Parquet に変換してから、Glue Crawler にかける ( ※ 変換掛ける前に Header 情報を削除しておきましょう。)

1の実装例

create_external_table.ddl
CREATE EXTERNAL TABLE IF NOT EXISTS test_csv_serde (
  `column_a` string,
  `column_b` string
)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
WITH SERDEPROPERTIES (
  'separatorChar' = ',',
  'quoteChar' = '"',
  'escapeChar' = '\\'
)
STORED AS INPUTFORMAT 'org.apache.hadoop.mapred.TextInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION 's3://{YOUR BUCKET NAME}/{YOUR PREFIX NAME}/'
TBLPROPERTIES (
'classification' = 'csv',
'skip.header.line.count' = '1'
)
;

結果
正常に読み込まれている。
image.png

まとめ

LazySimpleSerDe には気をつけましよう。

参考

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?