Hive 配置单元外部表跳过第一行

Hive 配置单元外部表跳过第一行,hive,cloudera,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" =

我正在使用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'
样本数据

RecordId,FirstName,LastName
1,"John","Doe"
2,"Jane","Doe"

有谁能帮我跳过第一行,或者我需要添加中间步骤吗?

我不太确定它是否适用于行格式serde'com.bizo.hive.serde.csv.CSVSerde',但我想它应该类似于以“,”结尾的行格式分隔字段。
在您的情况下,第一行将被视为正常行。但第一个字段不能为INT,所以第一行的所有字段都将设置为NULL。您只需一个中间步骤即可修复它:

INSERT OVERWRITE TABLE Test
SELECT * from Test WHERE RecordId IS NOT NULL

只有一个缺点是原始csv文件将被修改。我希望有帮助。德国劳埃德船级社

数据中的标题行在配置单元中是一个永远令人头痛的问题。除了修改蜂巢的来源,我相信没有中间步骤你是逃不掉的。(编辑:这不再正确,请参阅下面的更新)

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

如果您愿意在每个涉及表的查询中过滤掉标题行,那么您就可以不需要额外的数据加载步骤。不幸的是,这几乎在其他地方增加了一个额外的设置。当标题行违反您的模式时,您将不得不变得聪明/混乱。如果使用这种方法,您可能会考虑编写自定义Server,使该行更易于过滤。不幸的是,SerDe不能完全删除该行(或者这可能形成一个可能的解决方案),它们必须返回类似于
null
的内容。我从未在实践中见过这种处理标题行的方法,因为它使阅读变得痛苦,而且阅读往往比写作更常见。如果您正在处理一个表,或者如果标题行只是许多格式不正确的行中的一行,那么它可能会占有一席之地

您可以在数据加载中删除第一行时进行一次过滤。
INSERT
语句中的
WHERE
子句就可以了。您可以使用诸如
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");

我也在努力解决这个问题,并没有办法告诉蜂巢跳过第一排,就像在绿梅中一样。所以最后我不得不从文件中删除它。
e、 g.“cat File.csv | grep-v RecordId>File_no_header.csv”

跳过.header.line.count将跳过头行


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

当您从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')
这样,您就可以完全控制分隔符、引号字符、转义字符、null处理和标头处理


查看和。

只需在查询中附加以下属性,记录中的第一个标题或行将不会加载或被跳过

试试这个

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

仅适用于已创建带有标题的表的用户。下面是同样的alter命令。如果您已经有了表,并且希望在不删除和重新创建的情况下忽略第一行,那么这将非常有用。它还可以帮助人们熟悉ALTER作为TBLProperty的一个选项

ALTER TABLE tablename SET TBLPROPERTIES ("skip.header.line.count"="1");

我自己刚开始玩Hive,据我所知,SerDe的工作只是一行一行地进行的,所以如果没有中间人,这可能是不可能的。如果我能想到什么,我会把它贴在这里。我还对一个解决方案感兴趣。CSVSerDe用于消除CSV文件中的双引号。看起来您现在可以使用“SET skip.header.line.count=1;”跳过标题行。有关更多信息,请参阅上的修补程序说明。感谢非常有用的更新!我目前在使用Hive方面做得不够好,无法跟上这样的变化。我已经把这篇文章做成了一个社区维基,所以如果你测试了SET skip.header.line.count,如果你能修改我的答案,我将不胜感激(尽管在0.13.0以下的版本中暂时为人们保留一些变通方法)。它可以工作,但也有它自己的问题。当生成多个输出文件时,即减缩器大于1,它会跳过每个文件的第一条记录,而这些文件不是所需的行为,也不是说此解决方案也包含在顶部答案中:-)来这里寻找此答案,因为我使用的是AWS Athena,这要求我使用OpenCSVSerde。我已经有一段时间没有接触过HIVE了,但是由于这个SerDe来自HIVE堆栈,所以很高兴看到关于OpenCSVSerde的第二个答案。谢谢@NirmalOne重要提示-我在SerDe文档中发现了这一点。限制此SerDe将所有列视为字符串类型。即使使用此SerDe创建具有非字符串列类型的表,描述表输出也会显示字符串列类型。从SerDe检索类型信息。要将表中的列转换为所需类型,可以在表上创建一个视图,对所需类型进行转换。
ALTER TABLE tablename SET TBLPROPERTIES ("skip.header.line.count"="1");