2012-11-29 20 views
30

我試圖加載CSV文件轉換成蜂巢表所示:用逗號蜂巢負載CSV在引述領域

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的分隔符,因爲它被從外部源拉取。

回答

24

問題是Hive不處理帶引號的文本。您需要通過更改字段之間的分隔符(例如:使用Hadoop流式作業)來預處理數據,或者也可以嘗試使用使用OpenCSV解析文件的自定義CSV SerDe

+0

謝謝你做到了! –

+0

sed -i's /「// g'your_file_name通過刪除引用的文本進行預處理。但是,您需要確保不會無意中刪除其他打算引用的(」)字符。 – ekta

25

如果可以重新創建或解析您的輸入數據,你可以指定CREATE TABLE轉義字符:

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

會接受這條線作爲4場

1,some text\, with comma in it,123,more text 
+2

處理嵌入的逗號,但不處理嵌入的換行符,這是CSV數據中的其他問題。或者換行符也可以逃脫? https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL#LanguageManualDDL-CreateTable中的規範似乎不允許轉義換行符。 –

14

由於蜂巢0.14的CSV SERDE是蜂巢的一個標準部分安裝

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

(請參閱:https://cwiki.apache.org/confluence/display/Hive/CSV+Serde

+0

如果你的HIVE是最新的,這是最好的答案:) – bartektartanus

+0

這也幫助了我! – Kulasangar

+1

當你使用OpenCSVSerde時,有沒有一種方法可以指定定義了哪些Null?使用「ROW FORMAT DELIMITED」我可以添加選項「NULL DEFINED AS''」來識別數據中的空值。 – JeffR

0

將分隔符保留在單引號中它將起作用。

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

這將工作

0

添加一個反斜槓在TERMINATED田野 '\;'

例如:

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; 

我測試,和它的工作。