Hive外部表跳过第一行

Ric*_*ins 47 hive cloudera

我正在使用Cloudera的Hive版本并尝试在包含第一列中的列名的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'
Run Code Online (Sandbox Code Playgroud)

样本数据

RecordId,FirstName,LastName
1,"John","Doe"
2,"Jane","Doe"
Run Code Online (Sandbox Code Playgroud)

任何人都可以帮助我跳过第一行或者我需要添加一个中间步骤吗?

Dan*_*man 76

数据中的标题行是Hive中的永久性头痛.如果没有修改Hive源,我相信没有中间步骤你就无法逃脱.(编辑:这不再是真的,请参阅下面的更新)

不幸的是,这回答了你的问题.我将为完整性的中间步骤提出一些想法.

如果您愿意在每个触及表的查询中过滤掉标题行,则可以在数据加载中没有额外步骤的情况下离开.不幸的是,这增加了其他地方的额外设置.当标题行违反您的模式时,您将不得不变得聪明/凌乱.如果你采用这种方法,你可以考虑编写一个自定义的SerDe,使这行更容易过滤.不幸的是,SerDe不能完全删除该行(或者可能形成一个可能的解决方案),他们必须返回类似的东西null.我从来没有在实践中看到这种方法来处理标题行,因为它使阅读变得痛苦,阅读往往比写作更常见.如果您正在处理一个表,或者标题行只是许多格式错误的行中的一行,那么它可能有一个位置.

您可以使用删除数据加载中第一行的变体进行一次此过滤.一个WHERE在条款INSERT声明会做到这一点.您可以使用实用程序sed来摆脱它.我已经看到了两种方法.在你采取哪种方法之间存在权衡,也不是处理标题行的唯一方法.不幸的是,这两种方法都需要时间并且需要临时复制数据.如果您绝对需要另一个应用程序的标题行,则复制将是永久性的.

更新:

从Hive 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");
Run Code Online (Sandbox Code Playgroud)

  • 看起来你现在可以使用"SET skip.header.line.count = 1;" 跳过标题行.有关更多信息,请参阅[https://issues.apache.org/jira/browse/HIVE-5795](https://issues.apache.org/jira/browse/HIVE-5795)上的补丁说明. (13认同)

Nir*_*mal 15

虽然您有Daniel的答案,但可以使用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')
Run Code Online (Sandbox Code Playgroud)

有了这个,您可以完全控制分隔符,引号字符,转义字符,空值处理和标题处理.

这里这里.


小智 9

只需在查询中追加属性下方,并且第一个标题或行int将不会加载记录,也不会跳过它.

试试这个

tblproperties ("skip.header.line.count"="1");
Run Code Online (Sandbox Code Playgroud)


小智 5

skip.header.line.count将跳过标题行。

但是,如果您有一些外部工具可以访问该表,它仍然会看到实际数据,而不会跳过这些行