Как игнорировать заголовки в PySpark при использовании Athena и AWS Glue Data Catalog - PullRequest
0 голосов
/ 30 апреля 2018

Предположим, у меня есть CSV-файл, подобный этому:

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

Предположим, я ввожу следующую команду 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|
+----------+----------+

... и, конечно же, именно это я и получаю.

В кластере EMR, использующем каталог метаданных AWS Glue в Spark, я выдаю следующее в pyspark REPL:

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

Я ожидаю получить тот же вывод, но вместо этого получаю:

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

Очевидно, что Афина соблюдает tblproperty «skip.header.line.count», но PySpark, похоже, игнорирует ее.

Как заставить PySpark игнорировать эту строку заголовка, как это делает Афина?

1 Ответ

0 голосов
/ 30 апреля 2018

Любой из двух методов должен помочь вам:

(1) Установите количество строк заголовка, которое будет пропущено в параметре:

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

(2) Или, в запросе select используйте предложение where для фильтрации этой строки. Скажи:

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