我试图使用EMR /蜂巢从S3将数据导入到DynamoDB。 我的CSV文件被封闭双引号内并以逗号分隔的字段。 虽然在蜂巢创建外部表,我可以指定分隔符为逗号,但我怎么指定字段引号引起来?
如果我不指定,我看到,在DynamoDB值中的两个双引号“‘价值’”这似乎是错的填充。
我使用下面的命令来创建外部表。 是否有指定的字段双引号括起来的方法吗?
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
Answer 1:
如果你坚持CSV文件格式,你必须使用自定义SERDE; 和这里的一些基于对opencsv libarary工作 。
但是,如果你可以修改的源文件,你可以选择一个新的分隔符,这样引用的字段是没有必要的(好运气),或重写逃避任何嵌入式逗号与一个转义字符,例如“\”,这可以行格式内指定用ESCAPED BY:
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';
Answer 2:
我也坚持同样的问题,因为我的农田包围加上双引号,并用分号(;)分隔。 我的表名是employee1。
所以,我已经搜索的链接,我已经找到完美的解决方案这一点。
我们必须使用SERDE这一点。 请通过以下链接下载SERDE罐子: 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;
现在你会看到神奇。 谢谢。
Answer 3:
下面的代码解决同类型的问题
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");
Answer 4:
蜂房现在包括一个OpenCSVSerde
这将正确地解析那些引用字段无需增加额外的罐或易错和慢正则表达式。
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
Answer 5:
蜂房不支持带引号的字符串开箱的。 有两种方法来解决这个:
- 使用不同的字段分隔符(如管)。
- 编写基于OpenCSV自定义InputFormat。
更快的(和可以说是更理智的)方法是修改您最初的出口过程中使用不同的分隔符这样可以尽量避免带引号的字符串。 这样,你可以告诉蜂房使用外部表制表符或竖线分隔符:
CREATE TABLE foo (
col1 INT,
col2 STRING
) ROW FORMAT DELIMITED FIELDS TERMINATED BY '|';
Answer 6:
使用csv-serde-0.9.1.jar
在蜂巢查询文件,请参阅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';
Answer 7:
可以有这个问题多种解决方案。
- 编写自定义类SERDE
- 使用RegexSerde
- 卸下数据逃脱字符分隔符
更多详情http://grokbase.com/t/hive/user/117t2c6zhe/urgent-hive-not-respecting-escaped-delimiter-characters
文章来源: How to handle fields enclosed within quotes(CSV) in importing data from S3 into DynamoDB using EMR/Hive