Pyspark 创建不在spark中工作的外部表,在Athena中工作

Pyspark 创建不在spark中工作的外部表,在Athena中工作,pyspark,amazon-athena,Pyspark,Amazon Athena,我正在尝试使用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.Ope

我正在尝试使用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)
当我运行上述代码时,我得到以下错误消息

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;'
然而,当我使用完全相同的CREATEEXTERNALTABLE语句并在Athena查询编辑器中手动运行它时,它工作得很好。我怀疑问题在于SerdeProperty部分中的引号/双引号,但我尝试了许多组合,但均无效。如果有人在create external table语句中有一个使用类似OpenCSVSerde定义的工作Spark查询,我将非常感谢他们的输入。我使用的Spark版本是2.4.3和python 3.0


我应该说,我的输入文件是一个CSV,包含文本和数字字段,文本字段用双引号括起来。

仔细查看OpenCSVSerde的文档,似乎双引号是默认的引号字符。换句话说,如果您没有明确地指定它,它将被假定。我认为分隔符也是如此(即默认为逗号),最后我删除了整个分隔符

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

“我的查询”和“我的spark查询”中的部分对OpenCSVSerde的文档进行了详细的分析,似乎双引号是默认的引号字符。换句话说,如果您没有明确地指定它,它将被假定。我认为分隔符也是如此(即默认为逗号),最后我删除了整个分隔符

WITH SERDEPROPERTIES
(
   'separatorChar' = ',',
   'quoteChar' = '"',
   'escapeChar' = '\\'
)  
我的查询和我的spark查询中的部分起了作用