17

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

指定しないと、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';

任意の提案をいただければ幸いです。ありがとうジテンドラ

4

7 に答える 7

20

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

そのため、リンクを検索して、これに対する完璧な解決策を見つけました。

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

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

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;

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

于 2014-03-05T06:29:54.487 に答える
12

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

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");
于 2016-04-17T12:59:37.027 に答える
3

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

ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'

于 2016-04-14T03:56:20.117 に答える
3

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

ただし、ソース ファイルを変更できる場合は、引用符で囲まれたフィールドが不要になるように新しい区切り文字を選択するか (頑張ってください)、埋め込まれているコンマを 1 つのエスケープ文字 ("\" など) でエスケープするように書き直すことができます。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';
于 2012-12-29T00:11:38.967 に答える
2

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

  1. 別のフィールド セパレータ (パイプなど) を使用します。
  2. OpenCSV に基づいてカスタム InputFormat を記述します。

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

CREATE TABLE foo (
  col1 INT,
  col2 STRING
) ROW FORMAT DELIMITED FIELDS TERMINATED BY '|';
于 2012-12-28T14:59:24.203 に答える
1

csv-serde-0.9.1.jarHive クエリでファイルを 使用します。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';
于 2016-02-24T09:44:51.637 に答える