创建外部 table 不在 spark 中工作,在 Athena 中工作
Create external table not working in spark, working in Athena
我正在尝试使用 pyspark 创建外部 table。
我的代码与下面类似:
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;'
但是,当我在 Athena 查询编辑器中手动使用完全相同的 CREATE EXTERNAL TABLE 语句和 运行 时,它工作得很好。我怀疑问题出在 SERDEPROPERTIES 部分中的 quotes/doublequotes,但我尝试了它们的多种组合但无济于事。如果有人在 create external table 语句中有一个使用类似 OpenCSVSerde 定义的有效 Spark 查询,我将不胜感激他们的意见。我使用的 Spark 版本是 2.4.3 python 3.something
我应该说我的输入文件是一个 CSV 文件,混合了文本和数字字段,文本字段用双引号括起来。
仔细查看 OpenCSVSerde 的文档,双引号似乎是默认的引号字符。换句话说,如果你没有明确指定它,它就是假定的。我认为分隔符也是如此(即默认为逗号),最后我只是删除了整个
WITH SERDEPROPERTIES
(
'separatorChar' = ',',
'quoteChar' = '"',
'escapeChar' = '\'
)
我的查询部分和我的 spark 查询很好用
我正在尝试使用 pyspark 创建外部 table。
我的代码与下面类似:
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;'
但是,当我在 Athena 查询编辑器中手动使用完全相同的 CREATE EXTERNAL TABLE 语句和 运行 时,它工作得很好。我怀疑问题出在 SERDEPROPERTIES 部分中的 quotes/doublequotes,但我尝试了它们的多种组合但无济于事。如果有人在 create external table 语句中有一个使用类似 OpenCSVSerde 定义的有效 Spark 查询,我将不胜感激他们的意见。我使用的 Spark 版本是 2.4.3 python 3.something
我应该说我的输入文件是一个 CSV 文件,混合了文本和数字字段,文本字段用双引号括起来。
仔细查看 OpenCSVSerde 的文档,双引号似乎是默认的引号字符。换句话说,如果你没有明确指定它,它就是假定的。我认为分隔符也是如此(即默认为逗号),最后我只是删除了整个
WITH SERDEPROPERTIES
(
'separatorChar' = ',',
'quoteChar' = '"',
'escapeChar' = '\'
)
我的查询部分和我的 spark 查询很好用