17

我正在尝试使用 EMR/Hive 将数据从 S3 导入 DynamoDB。我的 CSV 文件包含用双引号括起来并用逗号分隔的字段。在 hive 中创建外部表时,我可以将分隔符指定为逗号,但如何指定字段用引号括起来?

如果我不指定,我会看到 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';

任何建议,将不胜感激。谢谢吉滕德拉

4

7 回答 7

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
;

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

load data local inpath 'path/xyz.csv' into table employee1;

然后运行:

select * from employee1;

现在你会看到魔法。谢谢。

于 2014-03-05T06:29:54.487 回答
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");
于 2016-04-17T12:59:37.027 回答
3

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

但是,如果你可以修改源文件,你可以选择一个新的分隔符,这样引用的字段就不需要了(祝你好运),或者重写以使用单个转义字符转义任何嵌入的逗号,例如'\',这可以使用ESCAPEED 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';
于 2012-12-29T00:11:38.967 回答
3

Hive 现在包含一个OpenCSVSerde可以正确解析那些引用的字段,而无需添加额外的 jar 或容易出错且速度慢的正则表达式。

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

于 2016-04-14T03:56:20.117 回答
2

Hive 不支持开箱即用的带引号的字符串。有两种方法可以解决这个问题:

  1. 使用不同的字段分隔符(例如管道)。
  2. 编写基于 OpenCSV 的自定义 InputFormat。

更快(并且可以说更理智)的方法是修改您的初始导出过程以使用不同的分隔符,这样您就可以避免引用字符串。通过这种方式,您可以告诉 Hive 使用带有制表符或管道分隔符的外部表:

CREATE TABLE foo (
  col1 INT,
  col2 STRING
) ROW FORMAT DELIMITED FIELDS TERMINATED BY '|';
于 2012-12-28T14:59:24.203 回答
1

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';
于 2016-02-24T09:44:51.637 回答
0

这个问题可以有多种解决方案。

  1. 编写自定义 SerDe 类
  2. 使用 RegexSerde
  3. 从数据中删除转义的分隔符

在http://grokbase.com/t/hive/user/117t2c6zhe/urgent-hive-not-respecting-escaped-delimiter-characters阅读更多信息

于 2014-06-18T12:10:14.677 回答