查询不会跳过外部表的标头行

问题

你正在尝试查询某个外部 Hive 表,但即使在 HiveContext 中设置了 TBLPROPERTIES ('skip.header.line.count'='1'),该查询也持续无法跳过标题行。

可以使用此示例代码创建一个表来重现此问题。

CREATE EXTERNAL TABLE school_test_score (
  `school` varchar(254),
  `student_id` varchar(254),
  `gender` varchar(254),
  `pretest` varchar(254),
  `posttest` varchar(254))
ROW FORMAT DELIMITED
  FIELDS TERMINATED BY ','
  LINES TERMINATED BY '\n'
STORED AS INPUTFORMAT
  'org.apache.hadoop.mapred.TextInputFormat'
OUTPUTFORMAT
  'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION
  'dbfs:/FileStore/table_header/'
TBLPROPERTIES (
   'skip.header.line.count'='1'
)

如果你尝试选择表中的前五行,则第一行是标题行。

SELECT * FROM school_test_score LIMIT 5

表输出,其中的第一个数据行是标题行

原因

如果直接从 Hive 查询,则可以正确跳过标题行。 Apache Spark 无法识别 HiveContext 中的 skip.header.line.count 属性,因此它不会跳过标题行。

Spark 的行为与设计相符。

解决方案

需要使用 Spark header 选项创建表。

CREATE TABLE student_test_score (school String, student_id String, gender String, pretest String, posttest String) USING CSV
OPTIONS (path "dbfs:/FileStore/table_header/",
        delimiter ",",
        header "true")
        ;

选择表中的前五行,现在不再包括标题行。

SELECT * FROM school_test_score LIMIT 5

表输出,其中已跳过标题行