Hadoop 配置单元加载CSV,在带引号的字段中使用逗号

Hadoop 配置单元加载CSV,在带引号的字段中使用逗号,hadoop,hbase,hive,hdfs,delimiter,Hadoop,Hbase,Hive,Hdfs,Delimiter,我正在尝试将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,

我正在尝试将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"
这将返回损坏的数据,因为第一个字符串中有一个“,”。
有没有办法设置文本分隔符或使配置单元忽略字符串中的“,”字符


我无法更改csv的分隔符,因为它是从外部源提取的。

问题在于
Hive
不处理引用的文本。您需要通过更改字段之间的分隔符来预处理数据(例如:使用Hadoop流作业),或者您也可以尝试使用使用OpenCSV解析文件的自定义格式。

如果您可以重新创建或解析输入数据,您可以为创建表指定转义字符:

ROW FORMAT DELIMITED FIELDS TERMINATED BY "," ESCAPED BY '\\';
将接受此行作为4个字段

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

从配置单元0.14开始,CSV SerDe是配置单元安装的标准部分

行格式SERDE'org.apache.hadoop.hive.serde2.OpenCSVSerde'


(请参阅:)

将分隔符保留在单引号中,它将起作用

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

这将起作用

在以“\”结尾的字段中添加反斜杠

例如:

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;

我已经对它进行了测试,它成功了。

ORG.APACHE.HADOOP.HIVE.SERDE2.OPENCSVSERDE Serde为我工作。我的分隔符是“|”,其中一列用双引号括起来

查询:

创建外部表电子邮件(消息\u ID字符串、文本字符串、收件人字符串、发件人字符串、主题字符串、日期字符串)
行格式SERDE'ORG.APACHE.HADOOP.HIVE.SERDE2.OPENCSVSERDE'
具有serdeproperty(
“SEPARATORCHAR”=“|”,
“QUOTECHAR”=“\”,
“ESCAPECHAR”=“\”
)    
存储为文本文件位置“/user/abc/csv_folder”;

处理嵌入的逗号,但不处理嵌入的换行符,这是CSV数据中的另一个gotcha。或者新线也能逃脱吗?at的规范似乎不允许转义换行。非常感谢,这对我很有用。为了重新创建csv文件,我使用python csv writer和以下方言csv.register_方言('for_hive',escapechar='\\',quoting=csv.QUOTE_NONE)sed-I's//“//g”您的_文件名通过删除引用的文本来执行预处理。但是,您需要确保不会无意中删除其他预期引用的(“)如果你的蜂巢是最新的,这是最好的答案:)这对我也有帮助!当您使用OpenCSVSerde时,有没有办法指定Null的定义?使用“行格式分隔符”,我可以添加选项“NULL定义为“””来识别数据中的NULL值。这对我不起作用,配置单元将引用的值显示为“”NULL@wrschneider,我在哪里可以下载此serde?它从
“\;”开始工作
“;”是同一回事。不需要转义分号,但也不需要转义分号。它创建了一个包含模式中所有字符串的表