【问题标题】:How to load CSV data with enclosed by double quotes and separated by tab into HIVE table?如何将用双引号括起来并用制表符分隔的 CSV 数据加载到 HIVE 表中?
【发布时间】:2015-08-18 16:37:21
【问题描述】:

我正在尝试从 csv 文件中加载数据,其中的值用双引号 '"' 和制表符分隔 '\t' 括起来。 但是,当我尝试将其加载到配置单元中时,它不会引发任何错误,并且数据加载时没有任何错误,但我认为所有数据都被加载到单个列中,并且大多数值显示为 NULL。 下面是我的创建表语句。

CREATE TABLE example
(
organization  STRING,
order BIGINT,
created_on  TIMESTAMP,
issue_date TIMESTAMP,
qty  INT
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t' 
ESCAPED BY '"'
STORED AS TEXTFILE;

输入文件样本;-

 "Organization" "Order"  "Created on"   "issue_date"   "qty"
 "GB"   "111223"    "2015/02/06 00:00:00"   "2015/05/15 00:00:00"   "5"
 "UK"   "1110"  "2015/05/06 00:00:00"   "2015/06/1 00:00:00"   "51"

和 Load 语句将数据推送到 hive 表中。

 LOAD DATA INPATH '/user/example.csv' OVERWRITE INTO TABLE example

可能是什么问题以及如何忽略文件的标题。 如果我从 create 语句中删除 ESCAPED BY '"' ,它将加载到相应的列中,但所有值都用双引号引起来。 如何从值中删除双引号并忽略文件头?

【问题讨论】:

  • 您在运行 HUE 吗?在这种情况下,您可以使用 Metastore 管理器 webapp。

标签: hadoop hive


【解决方案1】:

您现在可以使用OpenCSVSerde,它允许您定义分隔符并轻松转义周围的双引号:

CREATE EXTERNAL TABLE example (
   organization  STRING,
   order BIGINT,
   created_on  TIMESTAMP,
   issue_date TIMESTAMP,
   qty  INT
)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
WITH SERDEPROPERTIES (
   "separatorChar" = "\t",
   "quoteChar"     = "\""
)  
LOCATION '/your/folder/location/';

【讨论】:

  • "此 SerDe 将所有列都视为字符串类型。即使您使用此 SerDe 创建具有非字符串列类型的表,DESCRIBE TABLE 输出也会显示字符串列类型。类型信息是从 SerDe 检索。要将表中的列转换为所需的类型,您可以在表上创建一个视图,将 CAST 转换为所需的类型。有没有另一种方法可以让我不必创建后续视图?
  • 对于任何新手(包括我自己),以防您不知道“SerDe”代表串行器/解串器。这里有一些非常有用的信息:cwiki.apache.org/confluence/display/Hive/SerDe
  • Upvote :) 如果您在分号前添加 tblproperties("skip.header.line.count"="1") ,则回答将是完整的。
  • 嗨,这个 openSCVSerde 不支持空值。你如何在这里处理空值。参考问题:stackoverflow.com/questions/61020631/…
  • @cheseaux 我有带有双引号的 csv 文件,例如 "ABC",9,10,"X,Y",88 我想按原样在带有列 (c1,c2, c3,c4,c5) 所以当我选择 c1,c2,c4 时它应该给出输出 "ABC" 9 "X,U" 即我想用双引号输出,是否可能
【解决方案2】:

您不想使用escaped by,这是用于转义字符,而不是引号字符。我不认为 Hive 实际上支持引号字符。您可能想查看接受 quotechar 属性的this csv serde

另外,如果你有 HUE,你可以使用 metastore manager webapp 来加载 CSV,这将处理标题行、列数据类型等。

【讨论】:

  • 感谢您的快速回复,但如果我从 create 语句中删除 ESCAPEED BY '"' ,它会加载到相应的列中,但所有值都用双引号括起来。
  • 是的,这很不幸。您可以使用 csv serde 来解决该问题,或者您也可以在从每个列中选择以删除双引号时执行 replace(column, '"', '')
  • 应该是regexp_replace(column, '"', ''),见cwiki.apache.org/confluence/display/Hive/…
  • 对于任何新手(包括我自己),以防您不知道“SerDe”代表串行器/解串器。这里有一些非常有用的信息:cwiki.apache.org/confluence/display/Hive/SerDe
【解决方案3】:

使用CSV Serde 创建表。我在 hive 中创建了一个表,如下所示,它的作用就像魅力一样。

CREATE EXTERNAL TABLE IF NOT EXISTS myTable (
id STRING,
url STRING,
name STRING
)
row format serde 'com.bizo.hive.serde.csv.CSVSerde'
with serdeproperties ("separatorChar" = "\t")
LOCATION '<folder location>';

【讨论】:

【解决方案4】:

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

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

来源 = 本·多尔

How to handle fields enclosed within quotes(CSV) in importing data from S3 into DynamoDB using EMR/Hive

【讨论】:

【解决方案5】:

您可以使用 CSV serde“ csv-serde-1.1.2.jar ”来加载不带双引号的文件。

下载链接:

http://ogrodnek.github.io/csv-serde/

和创建表语句为

CREATE TABLE <table_name> (col_name_1 type1, col_name_2 type2, ...) row format serde 'com.bizo.hive.serde.csv.CSVSerde';

您可以在create table stmt中删除具有以下属性的表头

tblproperties ("skip.header.line.count"="1");

【讨论】:

  • 这个 serde 已经内置了
  • @Marcin re:“这个 serde 是现在内置的”......这就是为什么 csv-serde-1.1.2-0.11.0-all.jar 链接不再从源代码中工作的原因(github.com/ogrodnek/csv-serde)?我现在如何让 SerDe 在 Hue 的“元存储表”中工作?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多