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
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';
また、フィールドが二重引用符で囲まれ、セミコロン(;)で区切られているため、同じ問題に悩まされました。テーブル名は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;
今、あなたは魔法を見るでしょう。ありがとう。
次のコードは同じタイプの問題を解決しました
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");
HiveにOpenCSVSerde
が含まれるようになりました。これにより、jarを追加したり、エラーが発生したり、正規表現が遅くなったりすることなく、引用符で囲まれたフィールドが適切に解析されます。
ROW FORMAT SERDE 'org.Apache.hadoop.Hive.serde2.OpenCSVSerde'
Hiveは、そのままでは引用符付きの文字列をサポートしていません。これを解決するには2つの方法があります。
より高速な(そしておそらくより健全な)アプローチは、最初のエクスポートプロセスを変更して別の区切り文字を使用することです。これにより、引用符で囲まれた文字列を回避できます。このようにして、タブまたはパイプの区切り文字で外部テーブルを使用するようにHiveに指示できます。
CREATE TABLE foo (
col1 INT,
col2 STRING
) ROW FORMAT DELIMITED FIELDS TERMINATED BY '|';
使用 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';
この問題には複数の解決策があります。
詳しくは http://grokbase.com/t/Hive/user/117t2c6zhe/urgent-Hive-not-respecting-escaped-delimiter-characters をご覧ください。