web-dev-qa-db-ja.com

引用符で囲まれたフィールドにコンマを含むハイブロードCSV

私はCSVファイルをHiveテーブルに次のようにロードしようとしています:

CREATE TABLE mytable
(
num1 INT,
text1 STRING,
num2 INT,
text2 STRING
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ",";

LOAD DATA LOCAL INPATH '/data.csv'
OVERWRITE INTO TABLE mytable;    


csvはコンマ(、)で区切られ、次のようになります。

1, "some text, with comma in it", 123, "more text"

最初の文字列に「、」があるため、これは破損したデータを返します。
テキスト区切り文字を設定する方法や、Hiveに文字列の「、」を無視させる方法はありますか?

Csvは外部ソースから取得されるため、csvの区切り文字を変更することはできません。

44

問題は、Hiveが引用テキストを処理しないことです。フィールド間の区切り文字を変更してデータを前処理する必要があります(例:Hadoopストリーミングジョブで)。または、OpenCSVを使用するカスタム CSV SerDe を使用してみることもできます。ファイルを解析します。

31
Lorand Bendig

入力データを再作成または解析できる場合は、CREATE TABLEにエスケープ文字を指定できます。

ROW FORMAT DELIMITED FIELDS TERMINATED BY "," ESCAPED BY '\\';

この行を4つのフィールドとして受け入れます

1,some text\, with comma in it,123,more text
30
libjack

Hive 0.14以降、CSV SerDeはHiveインストールの標準部分です

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

(参照: https://cwiki.Apache.org/confluence/display/Hive/CSV+Serde

21
wrschneider

区切り文字は機能する単一引用符で囲んでください。

ROW FORMAT DELIMITED 
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\n';

これは動作します

0
suyash

FIELDS TERMINATED BY '\;'にバックスラッシュを追加します

例えば:

CREATE  TABLE demo_table_1_csv
COMMENT 'my_csv_table 1'
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\;'
LINES TERMINATED BY '\n'
STORED AS TEXTFILE
LOCATION 'your_hdfs_path'
AS 
select a.tran_uuid,a.cust_id,a.risk_flag,a.lookback_start_date,a.lookback_end_date,b.scn_name,b.alerted_risk_category,
CASE WHEN (b.activity_id is not null ) THEN 1 ELSE 0 END as Alert_Flag 
FROM scn1_rcc1_agg as a LEFT OUTER JOIN scenario_activity_alert as b ON a.tran_uuid = b.activity_id;

私はそれをテストしましたが、うまくいきました。

0
Mantej Singh