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 - 无法正确创建分区并从数据框中保存表