蜂巢外部表跳过第一行(Hive External Table Skip First Row)

2019-08-18 19:53发布

我使用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
标签: hive Cloudera