![](/img/trans.png)
[英]Only one mapper when backing up DynamoDB to S3 using EMR and Hive
[英]How to handle fields enclosed within quotes(CSV) in importing data from S3 into DynamoDB using EMR/Hive
我正在尝试使用EMR / Hive将数据从S3导入DynamoDB。 我的CSV文件包含用双引号括起来并用逗号分隔的字段。 在hive中创建外部表时,我可以将分隔符指定为逗号但是如何指定字段用引号括起来?
如果我没有指定,我看到DynamoDB中的值填充在两个双引号“”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';
任何建议,将不胜感激。 谢谢Jitendra
我也遇到了同样的问题,因为我的字段用双引号括起来并用分号(;)分隔。 我的表名是employee1。
所以我搜索了链接,我找到了完美的解决方案。
我们必须为此使用serde。 请使用以下链接下载serde jar: https : //github.com/downloads/IllyaYalovyy/csv-serde/csv-serde-0.9.1.jar
然后使用hive提示符执行以下步骤:
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;
现在你将看到魔力。 谢谢。
以下代码解决了相同类型的问题
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");
如果您坚持使用CSV文件格式,则必须使用自定义SerDe; 这是基于opencsv图书馆的一些工作 。
但是,如果你可以修改源文件,你可以选择一个新的分隔符,以便引用的字段不是必需的(祝你好运),或者重写以逃避任何带有单个转义字符的嵌入式逗号,例如'\\',可以使用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';
Hive现在包含一个OpenCSVSerde
,它可以正确地解析那些引用的字段,而无需添加额外的jar或容易出错和正则表达式。
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
Hive不支持开箱即用的字符串。 有两种方法可以解决这个问题:
更快(并且可以说更健全)的方法是修改您的初始导出过程以使用不同的分隔符,以便您可以避免引用的字符串。 通过这种方式,您可以告诉Hive使用带有制表符或管道分隔符的外部表:
CREATE TABLE foo (
col1 INT,
col2 STRING
) ROW FORMAT DELIMITED FIELDS TERMINATED BY '|';
在您的配置单元查询中使用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';
这个问题可以有多种解决方案。
更多信息,请访问http://grokbase.com/t/hive/user/117t2c6zhe/urgent-hive-not-respecting-escaped-delimiter-characters
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.