pyspark 2.4 无法从 sql 命令创建表需要 Hive 支持才能创建 Hive TABLE

Posted

技术标签:

【中文标题】pyspark 2.4 无法从 sql 命令创建表需要 Hive 支持才能创建 Hive TABLE【英文标题】:pyspark 2.4 cannot create table from sql command Hive support is required to CREATE Hive TABLE 【发布时间】:2019-06-25 14:35:31 【问题描述】:

我使用的是 pyspark 2.4,并且我已经启用了 HiveSupport:

spark = SparkSession.builder.appName("spark").enableHiveSupport().getOrCreate()

但是当我跑步时:

spark.sql("""
CREATE TABLE reporting.sport_ads AS

SELECT 
*
, 'Home' as HomeOrAway
, HomeTeam as TeamName
FROM adwords_ads_brand
UNION
SELECT 
*
, 'Away' as HomeOrAway
, AwayTeam as TeamName
FROM adwords_ads_brand
""")

我遇到了错误:

pyspark.sql.utils.AnalysisException: "Hive support is required to CREATE Hive TABLE (AS SELECT);;\n'CreateTable `reporting`.`sport_ads`, org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe, ErrorIfExists\n+- Distinct\n   +- Union\n      :-
....

这对我来说没有任何意义,我做错了吗?

ps:我必须补充一点,这段代码在 databricks 和带有 Scala 的 Spark 中运行良好。

【问题讨论】:

【参考方案1】:

在您的 pyspark

中检查以下配置值
>>> spark.sparkContext.getConf().get("spark.sql.catalogImplementation")

如果属性值未设置为 hive


尝试在 pyspark shell 中传递以下配置

--conf spark.sql.catalogImplementation=hive

然后再次运行您的代码。

UPDATE:

创建一个 dataframe 联合查询:

val df = spark.sql("""SELECT 
*
, 'Home' as HomeOrAway
, HomeTeam as TeamName
FROM adwords_ads_brand
UNION
SELECT 
*
, 'Away' as HomeOrAway
, AwayTeam as TeamName
FROM adwords_ads_brand""")

然后使用 .saveAsTable 函数将数据框保存为表格

df.format("<parquet,orc..etc>").saveAsTable("<table_name>")

【讨论】:

它说的是“hive” :(我觉得奇怪的是命令“CREATE TABLE” @JayCee,我尝试了类似的命令,它在pyspark 中运行良好。尝试使用此union 创建一个数据框,然后使用 df.saveAsTable("db.table")、***.com/questions/54967186/… 这成功了!实际上,这是另一个编码错误的表(缺少 .snappy.parquet),我应用了 .format('parquet').saveAsTable ,它就像一个魅力。非常感谢,请随时修改您的答案以供我验证。 @JayCee,太好了.. 请查看updated the answer 并验证它..!

以上是关于pyspark 2.4 无法从 sql 命令创建表需要 Hive 支持才能创建 Hive TABLE的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 pyspark 从 hive 表中查询复杂的 SQL 语句

带有 hive 的 pyspark - 无法正确创建分区并从数据框中保存表

如何使用其模式从 Pyspark 数据框创建配置单元表?

无法使用 PySpark 插入 SQL,但可以在 SQL 中使用

pyspark delta湖优化 - 无法解析SQL

无法在 jupyter notebook 中使用 pyspark 读取 MS SQL 表?