web-dev-qa-db-ja.com

EMR / Hiveを使用してS3からDynamoDBにデータをインポートするときに、引用符(CSV)で囲まれたフィールドを処理する方法

EMR/Hiveを使用して、S3からDynamoDBにデータをインポートしようとしています。私のCSVファイルには、二重引用符で囲まれ、コンマで区切られたフィールドがあります。 Hiveで外部テーブルを作成するときに、区切り文字をコンマとして指定できますが、フィールドを引用符で囲むように指定するにはどうすればよいですか?

指定しない場合、DynamoDBの値は2つの二重引用符「“ value”」で囲まれているように見えますが、これは誤りのようです。

次のコマンドを使用して外部テーブルを作成しています。フィールドを二重引用符で囲むことを指定する方法はありますか?

CREATE EXTERNAL TABLE emrS3_import_1(col1 string, col2 string, col3 string, col4 string)  ROW FORMAT DELIMITED FIELDS TERMINATED BY '","' LOCATION 's3://emrTest/folder';

任意の提案をいただければ幸いです。ありがとうJitendra

17
RandomQuestion

CSVファイル形式に悩まされている場合は、カスタムのSerDeを使用する必要があります。そして、これが opencsvライブラリに基づく作業 です。

ただし、ソースファイルを変更できる場合は、新しい区切り文字を選択して、引用符で囲まれたフィールドが不要になるようにするか(幸運)、単一のエスケープ文字で埋め込みコンマをエスケープするように書き換えることができます。 '\'、これはESCAPED BYを使用してROW FORMAT内で指定できます。

CREATE EXTERNAL TABLE emrS3_import_1(col1 string, col2 string, col3 string, col4 string)  ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' ESCAPED BY '\\' LOCATION 's3://emrTest/folder';
3
libjack

また、フィールドが二重引用符で囲まれ、セミコロン(;)で区切られているため、同じ問題に悩まされました。テーブル名はemployee1です。

だから私はリンクで検索し、これに対する完璧な解決策を見つけました。

これにはserdeを使用する必要があります。このリンクを使用してserde jarをダウンロードしてください: https://github.com/downloads/IllyaYalovyy/csv-serde/csv-serde-0.9.1.jar

次に、Hiveプロンプトを使用して以下の手順に従います。

add jar path/to/csv-serde.jar;

create table employee1(id string, name string, addr string)
row format serde 'com.bizo.Hive.serde.csv.CSVSerde'
with serdeproperties(
"separatorChar" = "\;",
"quoteChar" = "\"")
stored as textfile
;

以下のクエリを使用して、指定したパスからデータをロードします。

load data local inpath 'path/xyz.csv' into table employee1;

次に実行します:

select * from employee1;

今、あなたは魔法を見るでしょう。ありがとう。

20
Cast_A_Way

次のコードは同じタイプの問題を解決しました

CREATE TABLE TableRowCSV2(    
    CODE STRING,        
    PRODUCTCODE STRING, 
    PRICE STRING     
)
    COMMENT 'row data csv'    
ROW FORMAT SERDE 'org.Apache.hadoop.Hive.serde2.OpenCSVSerde'

WITH SERDEPROPERTIES (
   "separatorChar" = "\,",
   "quoteChar"     = "\""
)
STORED AS TEXTFILE
tblproperties("skip.header.line.count"="1");
12
Shankar

HiveにOpenCSVSerdeが含まれるようになりました。これにより、jarを追加したり、エラーが発生したり、正規表現が遅くなったりすることなく、引用符で囲まれたフィールドが適切に解析されます。

ROW FORMAT SERDE 'org.Apache.hadoop.Hive.serde2.OpenCSVSerde'

3
Ben Doerr

Hiveは、そのままでは引用符付きの文字列をサポートしていません。これを解決するには2つの方法があります。

  1. 別のフィールド区切り記号(パイプなど)を使用します。
  2. OpenCSVに基づくカスタムInputFormatを記述します。

より高速な(そしておそらくより健全な)アプローチは、最初のエクスポートプロセスを変更して別の区切り文字を使用することです。これにより、引用符で囲まれた文字列を回避できます。このようにして、タブまたはパイプの区切り文字で外部テーブルを使用するようにHiveに指示できます。

CREATE TABLE foo (
  col1 INT,
  col2 STRING
) ROW FORMAT DELIMITED FIELDS TERMINATED BY '|';
2

使用 csv-serde-0.9.1.jar Hiveクエリのファイル。次を参照してください http://illyayalovyy.github.io/csv-serde/

add jar /path/to/jar_file

Create external table emrS3_import_1(col1 string, col2 string, col3 string, col4 string) row format serde 'com.bizo.Hive.serde.csv.CSVSerde'
with serdeproperties
(
  "separatorChar" = "\;",
  "quoteChar" = "\"
) stored as textfile
tblproperties("skip.header.line.count"="1") ---to skip if have any header file
LOCATION 's3://emrTest/folder';
1
Amit

この問題には複数の解決策があります。

  1. カスタムSerDeクラスを作成する
  2. RegexSerdeを使用する
  3. エスケープされた区切り文字をデータから削除する

詳しくは http://grokbase.com/t/Hive/user/117t2c6zhe/urgent-Hive-not-respecting-escaped-delimiter-characters をご覧ください。

0
minhas23