使用Athena和AWS Glue Data Catalog时如何忽略PySpark中的标头

时间:2018-04-29 22:47:38

标签: pyspark amazon-emr pyspark-sql aws-glue

假设我有一个这样的CSV文件:

"Col1Name", "Col2Name"
"a", "b"
"c", "d"

假设我在Athena中发出以下CREATE EXTERNAL TABLE命令:

CREATE EXTERNAL TABLE test.sometable (
   col1name string,
   col2name string
) 
row format serde 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
with serdeproperties (
   'separatorChar' = ',',
   'quoteChar' = '\"',
   'escapeChar' = '\\'
) 
stored as textfile
location 's3://somebucket/some/path/'
tblproperties("skip.header.line.count"="1")

然后我发出以下SELECT:

SELECT * FROM test.sometable

我希望得到以下内容:

+----------+----------+
|  col1name|  col2name|
+----------+----------+
|         a|         b|
|         c|         d|
+----------+----------+

......果然,这正是我得到的。

在使用Spark中的AWS Glue元数据目录的EMR集群上,我在pyspark REPL中发出以下内容:

a = spark.sql("select * from test.sometable")
a.show()

我希望收到相同的输出,但相反,我得到了这个:

+----------+----------+
|  col1name|  col2name|
+----------+----------+
|  col1name|  col2name|
|         a|         b|
|         c|         d|
+----------+----------+

显然,Athena正在尊重“skip.header.line.count”tblproperty,但PySpark似乎忽略了它。

如何让PySpark忽略这个标题行,就像Athena那样?

1 个答案:

答案 0 :(得分:0)

这两种方法中的任何一种都可以帮到你:

(1)在参数中设置要跳过的标题行计数:

'skip.header.line.count'='1'

(2)或者,在select查询中使用where子句来过滤该行。说:

SELECT * FROM test.sometable where col1name <> 'col1name'