使用 pyspark 更改配置单元表后的架构错误

Posted

技术标签:

【中文标题】使用 pyspark 更改配置单元表后的架构错误【英文标题】:Schema error after altering hive table with pyspark 【发布时间】:2017-03-23 17:59:08 【问题描述】:

我在 hive 中有一个名为 test 的表,其中包含 idname

现在我在 hive 中有另一个名为 mysql 的表,其中包含 idnamecity 列。

现在我想比较两个表的架构并将列差异添加到配置单元表test

hive_df= sqlContext.table("testing.test")

mysql_df= sqlContext.table("testing.mysql")

hive_df.dtypes

[('id', 'int'), ('name', 'string')]

mysql_df.dtypes

[('id', 'int'), ('name', 'string'), ('city', 'string')]

hive_dtypes=hive_df.dtypes

hive_dtypes

[('id', 'int'), ('name', 'string')]


mysql_dtypes= mysql_df.dtypes

diff = set(mysql_dtypes) ^ set(hive_dtypes)

diff

set([('city', 'string')])

for col_name, col_type in diff:
...  sqlContext.sql("ALTER TABLE testing.test ADD COLUMNS (0 1)".format(col_name, col_type))
...

完成所有这些操作后,hive 表 test 将添加新列 city,并按预期添加空值。

现在当我关闭 spark 会话并打开一个新的 spark 会话时,当我这样做时

hive_df= sqlContext.table("testing.test")

然后

hive_df

我应该得到

DataFrame[id: int, name: string, city: string]

但我明白了

DataFrame[id: int, name: string]

当我做一个 desc hive 表时test

hive> desc test;
OK
id                      int
name                    string
city                    string

为什么在我们更改相应的 hive 表后架构更改没有反映在 Pyspark 数据框中?

仅供参考,我使用的是 spark 1.6

【问题讨论】:

是分区表吗? 有您的reload 元数据吗? @zero323 是的,我已经完成了刷新表 @DuduMarkovitz 不,它不是分区表 Hive 表是如何存储的?这是一种列格式,其架构存储在每个文件中——例如 ORC 或 Parquet? (对于 Parquet 你应该仔细阅读spark.apache.org/docs/1.6.3/…) 【参考方案1】:

似乎有针对此问题的 Jira https://issues.apache.org/jira/browse/SPARK-9764,已在 Spark 2.0 中修复。

对于使用 spark 1.6 的用户,请尝试使用 sqlContext 创建表。

点赞first register the data frame as temp table 然后就可以了

sqlContext.sql("create table table as select * from temptable")

这样,在您更改 hive 表并重新创建 spark 数据框时,df 也将具有新添加的列。

这个问题在@zero323 的帮助下得到了解决

【讨论】:

以上是关于使用 pyspark 更改配置单元表后的架构错误的主要内容,如果未能解决你的问题,请参考以下文章

“创建目标表后架构已更改”错误如何发生?

在 Pyspark 中返回错误结果的 Impala 查询

无法使用 pyspark 将数据加载到配置单元中

创建 jpa 表后的 Flyway 迁移

从数据库中删除所有表后,如何将 prisma 重新部署到数据库

使用 pyspark 连接配置单元表