在使用EMR/Hive将数据从S3导入DynamoDB时,如何处理用引号(CSV)括起来的字段

Ran*_*ion 17 hive amazon-s3 amazon-web-services amazon-emr amazon-dynamodb

我正在尝试使用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';
Run Code Online (Sandbox Code Playgroud)

任何建议,将不胜感激.谢谢Jitendra

小智 20

我也遇到了同样的问题,因为我的字段用双引号括起来并用分号(;)分隔.我的表名是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
;
Run Code Online (Sandbox Code Playgroud)

然后使用以下查询从您的给定路径加载数据:

load data local inpath 'path/xyz.csv' into table employee1;
Run Code Online (Sandbox Code Playgroud)

然后运行:

select * from employee1;
Run Code Online (Sandbox Code Playgroud)

现在你将看到魔力.谢谢.


小智 12

以下代码解决了相同类型的问题

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");
Run Code Online (Sandbox Code Playgroud)


lib*_*ack 3

如果您坚持使用 CSV 文件格式,则必须使用自定义 SerDe;这是一些基于 opencsv 库的工作

但是,如果您可以修改源文件,则可以选择一个新的分隔符,以便不需要引用的字段(祝您好运),或者重写以使用单个转义字符(例如“\”)转义任何嵌入的逗号。可以在 ROW FORMAT 中使用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';
Run Code Online (Sandbox Code Playgroud)