58

我正在使用 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"

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

4

8 回答 8

94

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");

用于ALTER TABLE现有表:

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

请注意,虽然它可以工作,但它也有自己的问题。当生成多个输出文件时,即缩减器大于 1,它会跳过每个文件的第一条记录,这可能不一定是所需的行为。

于 2013-04-01T22:38:51.580 回答
24

虽然您从丹尼尔那里得到了答案,但这里有一些可以使用的自定义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')

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

看看这里这里

于 2016-09-16T06:17:47.460 回答
11

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

试试这个

tblproperties ("skip.header.line.count"="1");
于 2016-11-27T06:40:40.557 回答
4

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

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

于 2016-03-09T20:58:03.137 回答
2
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');
于 2015-06-19T06:55:53.437 回答
1

我不太确定它是否适用于 ROW FORMAT serde 'com.bizo.hive.serde.csv.CSVSerde' 但我想它应该类似于 ROW FORMAT DELIMITED FIELDS TERMINATED BY ','。
在您的情况下,第一行将被视为普通行。但是第一个字段无法为 INT,因此第一行的所有字段都将设置为 NULL。您只需要一个中间步骤即可修复它:

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

只有一个缺点是您的原始 csv 文件将被修改。我希望它有所帮助。GL!

于 2013-04-01T22:18:06.813 回答
1

仅适用于已经创建带有标题的表格的人。这是相同的alter命令。如果您已经拥有表并希望忽略第一行而不删除和重新创建,这很有用。它还有助于人们熟悉 ALTER 作为 TBLPROPERTIES 的一个选项。

ALTER TABLE tablename SET TBLPROPERTIES ("skip.header.line.count"="1");
于 2019-01-15T16:28:32.703 回答
0

我也为此苦苦挣扎,发现无法告诉 hive 跳过第一行,就像在 Greenplum 中一样。所以最后我不得不从文件中删除它。例如“cat File.csv | grep -v RecordId > File_no_header.csv”

于 2013-11-26T12:46:24.223 回答