python - Spark insertInto 使用不同大小写的分区列失败。蜂巢虫?
问题描述
我正在测试使用 PySparkinsertInto()
将数据插入现有表的方法。我遇到了一个我认为是已知错误的结果的问题,并且正在寻求确认。我也想知道是否有我不知道的解决方法。
此代码成功创建了一个表并将数据插入其中:
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: Partition spec {pcol=, PCOL=1} contains non-partition columns;'
我知道我可以通过使用 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 语法创建了现有的表,因此我们必须支持这种情况。
我的问题是:
- 有没有一种我不知道的方法可以用来
insertInto()
对付出现这个问题的表? - HIVE- 14032 - INSERT OVERWRITE 命令因区分大小写的分区键名称而失败 是我遇到的根本原因吗?
解决方案
推荐阅读
- lucene - Lucene BlockJoin 查询以匹配所有术语出现在父文档或子文档中时
- django - 点赞按钮会跳转到新页面,怎么改成模态模式
- jenkins - 在詹金斯构建中的一段时间后停止 JMeter 脚本
- powershell - Where-Object、Select-Object 和 ForEach-object - 区别和用法
- php - PHP包含来自另一个多个目录的文件
- javascript - 在饼图上使用 billboardjs 显示不带小数的百分比
- android - 在这种情况下我应该使用 FLAG_ACTIVITY_CLEAR_TOP 吗?如何使用 FLAG_ACTIVITY_CLEAR_TOP 意图标志?
- sql-server - SQL Server:从 XML 数据输出中的任意节点中选择特定值 - 已回答
- java - 来自 Spring-Boot 的高级 Rest 客户端 7.1.1:java.lang.NoSuchMethodError: org.elasticsearch.action.bulk.BulkRequest.pipeline()Ljava/lang/String;
- java - 无法将争论发送到 GoogleGson 的 FromJSON 方法