Spark insertInto使用不同情况的分区列失败。蜂巢虫?

时间:2018-05-15 10:42:17

标签: python apache-spark hive pyspark

我正在测试使用PySpark的insertInto()方法将数据插入现有表中。我遇到了一个问题,我认为这是一个已知错误的结果,我正在寻求确认。我也想知道是否有一个我不知道的解决方法。

我正在使用Spark v2.2.1:
enter image description here

并且,如果要信任此命令,则Hive v2.1.1
enter image description here

此代码成功创建了一个表并将数据插入其中:

table_name = "default.insert_test"
sqlContext.sql("DROP TABLE IF EXISTS %s" % table_name)
sql = """
CREATE TABLE %s (col string)
PARTITIONED BY (pcol bigint)
STORED AS PARQUET
""" % table_name
sqlContext.sql(sql)
sqlContext.createDataFrame([('Alice', 1)], ['name', 'age'])\
.write.mode('overwrite').insertInto(table_name)

但是这段代码(唯一的区别是分区列名称的上限):

table_name = "default.insert_test"
sqlContext.sql("DROP TABLE IF EXISTS %s" % table_name)
sql = """
CREATE TABLE %s (col string)
PARTITIONED BY (PCOL bigint)
STORED AS PARQUET
""" % table_name
sqlContext.sql(sql)
sqlContext.createDataFrame([('Alice', 1)], ['name', 'age'])\
.write.mode('overwrite').insertInto(table_name)

insertInto()的调用失败,错误:

  

AnalysisException:   u'org.apache.hadoop.hive.ql.metadata.Table.ValidationFailureSemanticException:   分区规范{pcol =,PCOL = 1}包含非分区列;'

我知道我可以通过使用Spark SQL的新CREATE TABLE语法(参见SPARK-18885 - unify CREATE TABLE syntax for data source and hive serde tables)解决此问题,如下所示:

table_name = "default.insert_test"
sqlContext.sql("DROP TABLE IF EXISTS %s" % table_name)
sql = """
CREATE TABLE %s (col string, PCOL bigint)
USING PARQUET
PARTITIONED BY (PCOL)
""" % table_name
sqlContext.sql(sql)
sqlContext.createDataFrame([('Alice', 1)], ['name', 'age'])\
.write.mode('overwrite').insertInto(table_name)

不幸的是,我们的客户端使用旧的CREATE TABLE语法创建了现有的表,因此它是我们必须支持的场景。

我的问题是:

  1. 有什么方法我不知道使用insertInto()反对 显示此问题的表格?
  2. HIVE-14032 - INSERT OVERWRITE command failed with case sensitive partition key names 我遇到的根本原因是什么?

0 个答案:

没有答案