使用 pyspark 更改配置单元表后的架构错误
Posted
技术标签:
【中文标题】使用 pyspark 更改配置单元表后的架构错误【英文标题】:Schema error after altering hive table with pyspark 【发布时间】:2017-03-23 17:59:08 【问题描述】:我在 hive 中有一个名为 test
的表,其中包含 id
和 name
列
现在我在 hive 中有另一个名为 mysql 的表,其中包含 id
、name
和 city
列。
现在我想比较两个表的架构并将列差异添加到配置单元表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 更改配置单元表后的架构错误的主要内容,如果未能解决你的问题,请参考以下文章