spark insertinto使用不同大小写的分区列失败 hive 虫?

gmxoilav  于 2021-06-26  发布在  Hive
关注(0)|答案(0)|浏览(222)

我在测试Pypark的用法 insertInto() 将数据插入现有表的方法。我遇到了一个问题,我相信这是一个已知的错误的后果,并寻求确认。我还想知道是否有一个变通办法,我不知道。
我正在使用spark v2.2.1:

如果要信任此命令,请访问hive v2.1.1

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

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.validationfailuresemanticeException:分区规范{pcol=,pcol=1}包含非分区列;'
我知道我可以通过使用spark sql新的创建表语法(请参阅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语法创建现有表的客户机,因此这是我们必须支持的场景。
我的问题是:
有我不知道的方法吗 insertInto() 针对显示此问题的表?
hive-14032-insert overwrite命令失败,分区键名称区分大小写,这是我遇到的问题的根本原因吗?

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题