Hadoop 如何将用双引号括起来并用制表符分隔的CSV数据加载到配置单元表中?

Hadoop 如何将用双引号括起来并用制表符分隔的CSV数据加载到配置单元表中?,hadoop,hive,Hadoop,Hive,我正在尝试从csv文件加载数据,该文件中的值用双引号'''和制表符分隔'\t'括起来。 但当我尝试将其加载到配置单元中时,它不会抛出任何错误,并且数据加载时没有任何错误,但我认为所有数据都加载到一个列中,并且它显示为NULL的大多数值。 下面是我的CREATETABLE语句 CREATE TABLE example ( organization STRING, order BIGINT, created_on TIMESTAMP, issue_date TIMESTAMP, qty INT

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

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语句将数据推送到配置单元表中

 LOAD DATA INPATH '/user/example.csv' OVERWRITE INTO TABLE example
可能会出现什么问题,以及如何忽略文件头。 如果我从create语句中删除转义符“”,它将在相应的列中加载,但所有值都用双引号括起来。
如何从值中删除双引号并忽略文件头?

您不想使用
转义符,这是转义字符,而不是引号字符。我不认为Hive实际上支持引号字符。您可能想看看哪个接受quotechar属性

此外,如果您有色调,您可以使用metastore manager webapp加载CSV,这将处理标题行、列数据类型等。

您可以使用CSV serde“CSV-serde-1.1.2.jar”加载文件,而不使用双引号

下载链接:

CREATETABLE语句如下所示

CREATE TABLE <table_name> (col_name_1 type1, col_name_2 type2, ...) row format serde 'com.bizo.hive.serde.csv.CSVSerde';
用于创建表。我在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>';
如果myTable不存在,则创建外部表(
id字符串,
url字符串,
名称字符串
)
行格式serde'com.bizo.hive.serde.csv.CSVSerde'
具有SerdeProperty(“分离器CHAR”=“\t”)
位置“”;
“Hive现在包括一个OpenCSVSerde,它将正确解析那些引用的字段,而无需添加额外的JAR或容易出错且速度较慢的正则表达式。”

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

来源=Ben Doerr

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

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/';

你在跑步吗?在这种情况下,您可以使用metastore manager webapp。感谢您的快速回复,但如果我从create语句中删除转义符“”,则它将加载到相应的列中,但所有值都用双引号括起来。是的,这是不可原谅的。您可以使用csv serde来解决该问题,或者您也可以执行
replace(column')”“,”)
当您从每个列中选择删除双引号时。它应该是
regexp\u replace(列“,”,”)
,如果您不知道“SerDe”代表序列化器/反序列化器,请参阅那里的新手(包括我自己)。这里有一些非常有用的信息:这个SerDe是内置的now@Marcin关于:此serde现在内置“…这就是为什么csv-serde-1.1.2-0.11.0-all.jar链接从源代码()不再工作的原因吗?现在如何使serde在Hue的“Metastore Tables”中工作?”此serde将所有列视为字符串类型。即使使用此SerDe创建具有非字符串列类型的表,描述表输出也会显示字符串列类型。从SerDe检索类型信息。要将列转换为表中所需的类型,您可以在表上创建一个视图,对所需的类型进行转换。“有没有其他方法可以让我不必创建后续视图?对于任何新手(包括我自己),以防您不知道”SerDe“表示序列化程序/反序列化程序。这里有一些非常有用的信息:Upvote:)如果您在分号之前添加TBLProperty(“skip.header.line.count”=“1”),答案将是完整的。嗨,这个openSCVSerde不支持空值。这里如何处理空值。参考问题:@cheseaux我有一个带双引号的csv文件,例如“ABC”,9,10,“X,Y”,88我想在配置单元表中以列(c1,c2,c3,c4,c5)的形式加载它,所以当我选择c1,c2,c4时,它应该给出输出“ABC”9“X,U”也就是说,我希望输出带有双引号,如果您不知道“SerDe”代表序列化器/反序列化器,那么对于任何新手(包括我自己)来说都可能。这里有一些非常有用的信息:对于任何新手(包括我自己),如果你不知道“SerDe”代表序列化器/反序列化器。以下是一些非常有用的信息:
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/';