Создайте внешний стол, не работающий в искре, работающий в Афине - PullRequest
1 голос
/ 27 сентября 2019

Я пытаюсь использовать pyspark для создания внешней таблицы.

Мой код похож на следующий:

query="""
CREATE EXTERNAL TABLE IF NOT EXISTS myschema.mytable
(
col1  STRING,
col2  STRING,
col3  STRING,
col4  STRING,
... 
... a further 600+ columns here
...
)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
WITH SERDEPROPERTIES
(
   'separatorChar' = ',',
   'quoteChar' = '"',
   'escapeChar' = '\\'
)  
LOCATION 's3://mybucket/myfolder/'
"""
spark.sql(query)

Когда я запускаю приведенный выше код, я получаю следующую ошибкуmessage

u'org.apache.hadoop.hive.ql.metadata.HiveException: java.lang.StringIndexOutOfBoundsException: String index out of range: 0;'
Traceback (most recent call last):
  File "/usr/lib/spark/python/lib/pyspark.zip/pyspark/sql/session.py", line 767, in sql
    return DataFrame(self._jsparkSession.sql(sqlQuery), self._wrapped)
  File "/usr/lib/spark/python/lib/py4j-0.10.7-src.zip/py4j/java_gateway.py", line 1257, in __call__
    answer, self.gateway_client, self.target_id, self.name)
  File "/usr/lib/spark/python/lib/pyspark.zip/pyspark/sql/utils.py", line 69, in deco
    raise AnalysisException(s.split(': ', 1)[1], stackTrace)
AnalysisException: u'org.apache.hadoop.hive.ql.metadata.HiveException: java.lang.StringIndexOutOfBoundsException: String index out of range: 0;'

Однако, когда я беру точно такой же оператор CREATE EXTERNAL TABLE и запускаю его вручную в редакторе запросов Athena, он работает просто отлично.Я подозреваю, что проблема заключается в кавычках / двойных кавычках в разделе SERDEPROPERTIES, но я пробовал многочисленные их комбинации, но безрезультатно.если у кого-то есть рабочий запрос Spark, который использует аналогичное определение OpenCSVSerde в операторе создания внешней таблицы, я был бы признателен за его вклад.Я использую версию Spark 2.4.3 с python 3.something

Я должен был сказать, что мой входной файл представляет собой CSV со смесью текстовых и числовых полей, причем текстовые поля заключены в двойные кавычки.

1 Ответ

0 голосов
/ 27 сентября 2019

При более внимательном рассмотрении документов для OpenCSVSerde кажется, что двойная кавычка является символом кавычки по умолчанию.Другими словами, если вы не укажете это явно, это предполагается.Я подумал, что то же самое будет верно для символа разделителя (то есть по умолчанию это будет запятая), и в конце я просто удалил весь раздел

WITH SERDEPROPERTIES
(
   'separatorChar' = ',',
   'quoteChar' = '"',
   'escapeChar' = '\\'
)  

из моего запроса, и мой искровой запрос сработаллечить

...