Hive外部表-CSV文件-标题行

19

以下是我创建的Hive表:

CREATE EXTERNAL TABLE Activity (
  column1 type, </br>
  column2 type
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
LOCATION '/exttable/';

在我的HDFS位置/exttable中,我有很多CSV文件,并且每个CSV文件都包含标题行。当我执行select查询时,结果也包含标题行。

在HIVE中是否有一种方法可以忽略标题行或第一行?


1
可能是这个问题的重复。基本上那里和这里的答案是一样的,还有一些更多的建议。@kgu87的解决方案也可以。 - Daniel Koverman
这个回答解决了你的问题吗?如何在Hive外部表中跳过CSV头? - Jacek Laskowski
6个回答

27
现在在Hive 0.13.0中,您可以跳过标题计数。

tblproperties ("skip.header.line.count"="1");
这段代码表示在表格属性中设置跳过首行的数量为1。


2
请注意,使用 ALTER TABLE 也可以对现有表执行此操作。请参阅 https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL#LanguageManualDDL-AlterTableProperties。 - Mike

25

7
假设您想要加载以下位于/home/test/que.csv的csv文件:
1,TAP (PORTUGAL),AIRLINE
2,ANSA INTERNATIONAL,AUTO RENTAL
3,CARLTON HOTELS,HOTEL-MOTEL

现在,我们需要在HDFS中创建一个保存该数据的位置。
使用以下命令将`/home/test/que.csv`文件放入`/user/mcc`目录下: hadoop fs -put /home/test/que.csv /user/mcc 下一步是创建表。可以选择两种类型。有关如何选择,请参见此处
以下是外部表的示例:
create external table industry_ 
(
MCC string ,
MCC_Name string,
MCC_Group string
)       
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
STORED AS TEXTFILE
LOCATION '/user/mcc/'
tblproperties ("skip.header.line.count"="1");

注意:通过Spark SQL访问时,CSV的标题行将显示为数据行。 测试结果基于Spark版本2.4。

3

没有。但是,在将文件加载到HDFS之前,您可以预处理文件以跳过第一行 -

tail -n +2 withfirstrow.csv > withoutfirstrow.csv

或者,您可以将其构建到HIVE的where子句中,以忽略第一行。


在HIVE中,如何编写where子句以忽略第一行? - KalEl
1
如果数据包含标题行,则可以在HQL中使用where col <> 'header column name',假设数据本身不包含该值。对于Hive 0.13.0或更高版本,更好的选择是在定义表时使用skip.header.line.count。 - kgu87
我使用了Hive tblproperties ("skip.header.line.count"="1"); 属性。但是我仍然能够在HDFS表位置中看到标题。如何防止插入标题行到HDFS中? - Neethu Lalitha

0
如果您的Hive版本不支持tblproperties(“skip.header.line.count” =“1”),则可以使用以下Unix命令忽略第一行(列标题),然后将其放入HDFS。
 sed -n '2,$p' File_with_header.csv > File_with_No_header.csv

-2

要在原地从csv文件中删除标题,请使用以下命令:

sed -i 1d filename.csv 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接