我使用Cloudera的版本蜂房,并试图在包含在第一列的列名的csv文件创建外部表。 下面是我使用这样做的代码。
CREATE EXTERNAL TABLE Test (
RecordId int,
FirstName string,
LastName string
)
ROW FORMAT serde 'com.bizo.hive.serde.csv.CSVSerde'
WITH SerDeProperties (
"separatorChar" = ","
)
STORED AS TEXTFILE
LOCATION '/user/File.csv'
样本数据
RecordId,FirstName,LastName
1,"John","Doe"
2,"Jane","Doe"
任何人都可以帮我如何跳过第一行还是需要增加一个中间步骤?
Answer 1:
在数据报头行以蜂房永久头痛。 短修改蜂巢源的,我相信你不能没有一个中间步骤脱身。 (编辑:这不再是真实的,见下文更新)
不幸的是,回答你的问题。 我会扔在一些想法的完整性中间步骤。
你可以脱身,而无需在数据加载额外的步骤,如果你愿意过滤掉标题行上每一个接触表查询。 不幸的是这将增加额外的集几乎其他任何地方。 你将不得不弄巧/凌乱当标题行侵犯了您的架构。 如果用这种方法去,你可能会考虑写一个自定义SERDE,使该行更容易过滤。 不幸的是,SERDE的不能彻底删除的行(或可能形成一个可能的解决方案),他们必须返回类似null
。 我从来没有见过这种方法在实践中采取的应对标题行,因为它使阅读疼痛,阅读往往要比编写更为常见。 如果你正在处理一个的表,可能有一个地方,或者如果标题行仅仅是一个许多畸形的行中的一行。
你可以对删除该第一行中的数据负载的变化做这种过滤一次。 一个WHERE
在子句INSERT
语句会做到这一点。 您可以使用实用工具,比如sed
摆脱它。 我见过采取这两种方法。 有取舍之间接近你走也不是应对标题行中的唯一正确的方法。 不幸的是,这两种方法都需要时间和数据的临时复制。 如果你绝对需要的标题行的另一个应用程序,复制将是永久性的。
更新:
从蜂巢v0.13.0,您可以使用skip.header.line.count。 在创建表,你也可以指定相同的。 例如:
create external table testtable (name string, message string)
row format delimited
fields terminated by '\t'
lines terminated by '\n'
location '/testtable'
tblproperties ("skip.header.line.count"="1");
Answer 2:
当你从丹尼尔你的答案,这里使用的是一些自定义可能OpenCSVSerde
:
CREATE EXTERNAL TABLE `mydb`.`mytable`(
`product_name` string,
`brand_id` string,
`brand` string,
`color` string,
`description` string,
`sale_price` string)
PARTITIONED BY (
`seller_id` string)
ROW FORMAT SERDE
'org.apache.hadoop.hive.serde2.OpenCSVSerde'
WITH SERDEPROPERTIES (
'separatorChar' = '\t',
'quoteChar' = '"',
'escapeChar' = '\\')
STORED AS INPUTFORMAT
'org.apache.hadoop.mapred.TextInputFormat'
OUTPUTFORMAT
'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION
'hdfs://namenode.com:port/data/mydb/mytable'
TBLPROPERTIES (
'serialization.null.format' = '',
'skip.header.line.count' = '1')
有了这个,你有过的分隔符,引号字符总量控制,转义字符,空值处理和报头处理。
看看这里和这里 。
Answer 3:
您只需将以下属性查询中第一首标或行INT记录将不会加载,否则将被跳过。
试试这个
tblproperties ("skip.header.line.count"="1");
Answer 4:
create external table table_name(
Year int,
Month int,
column_name data_type )
row format delimited fields terminated by ','
location '/user/user_name/example_data' TBLPROPERTIES('serialization.null.format'='', 'skip.header.line.count'='1');
Answer 5:
skip.header.line.count的作品,但如果你有一些外部工具访问访问这个表,它仍然会看到,没有跳过这些行实际数据
Answer 6:
我不太清楚,如果它与行格式SERDE“com.bizo.hive.serde.csv.CSVSerde”但我想这应该是类似于行格式分隔的字段TERMINATED BY“”。
在你的情况下第一行会像正常的行处理。 但第一场失败是INT因此所有领域,为第一行,将被设置为NULL。 你只需要一个中间步骤来解决它:
INSERT OVERWRITE TABLE Test
SELECT * from Test WHERE RecordId IS NOT NULL
只有一个缺点是,你原来的csv文件将被修改。 我希望它能帮助。 GL!
Answer 7:
只是对于那些谁已经与包头创建的表。 下面是相同的alter命令。 这是非常有用的情况下,你已经有了表,并希望没有删除和重建被忽略的第一行。 它还可以帮助人们用ALTER熟悉与TBLPROPERTIES一个选项。
ALTER TABLE tablename SET TBLPROPERTIES ("skip.header.line.count"="1");
Answer 8:
我还挣扎,发现这个没有办法告诉蜂巢跳过第一行,好像有例如在Greenplum的。 所以最后我不得不从文件中删除它。 例如, “猫FILE.CSV | grep的-v的recordId> File_no_header.csv”
文章来源: Hive External Table Skip First Row