PySpark 为语法正确的 Hive 查询抛出 ParseException

Posted

技术标签:

【中文标题】PySpark 为语法正确的 Hive 查询抛出 ParseException【英文标题】:PySpark throwing ParseException for syntactical correct Hive Query 【发布时间】:2019-03-12 16:47:12 【问题描述】:

我得到了一个在直线中运行良好的 DDL 查询,但是当我尝试在 sparkSession 中运行相同的查询时,它会引发解析异常。

from pyspark import SparkContext, SparkConf
from pyspark.sql import SparkSession, HiveContext

# Initialise Hive metastore
SparkContext.setSystemProperty("hive.metastore.uris","thrift://localhsost:9083")

# Create Spark Session
sparkSession = (SparkSession\
                .builder\
                .appName('test_case')\
                .enableHiveSupport()\
                .getOrCreate())



sparkSession.sql("CREATE EXTERNAL TABLE B LIKE A")

Pyspark 异常:

pyspark.sql.utils.ParseException: u"\nmismatched input 'LIKE' expecting <EOF>(line 1, pos 53)\n\n== SQL ==\nCREATE EXTERNAL TABLE B LIKE A\n-----------------------------------------------------^^^\n"

如何使 hiveQL 函数在 pySpark 中工作? 问题似乎是查询的执行方式像 SparkSQL-Query 而不是 HiveQL-Query,即使我为 sparkSession 激活了 enableHiveSupport。

【问题讨论】:

发生同样的异常 我无法复制此错误,但请尝试其他解决方法:sparkSession.sql("CREATE EXTERNAL TABLE B AS (SELECT * FROM A WHERE 1=0)") 在尝试运行查询之前尝试运行sparkSession.sql("use name_of_target_hive_db") 之类的内容。 这些都不适合我。如前所述,查询是有效的 HQL 语法,并且在直线范围内永远不会失败。 Hive 支持似乎仍然不起作用。 【参考方案1】:

Spark SQL 查询默认使用 SparkSQL。要启用 HiveQL 语法,我相信您需要通过评论提示您的意图。 (公平地说,我不认为这是有据可查的;我只能在 Scala 版本的示例中找到对这件事的切向引用 here,。)

例如,我可以通过编写来解析我的命令:

%sql
-- `USING HIVE`
CREATE TABLE narf LIKE poit

现在,我没有在我的会话中启用 Hive 支持,所以我的查询失败了......但它确实解析了!


编辑:由于您的 SQL 语句是 Python 字符串,您可以使用 multi-line string 来使用单行注释语法,如下所示:

sparkSession.sql("""
  -- `USING HIVE`
  CREATE EXTERNAL TABLE B LIKE A
""")

SQL 中也有分隔注释语法,例如

sparkSession.sql("/* `USING HIVE` */ CREATE EXTERNAL TABLE B LIKE A")

这可能同样有效。

【讨论】:

我在 spark-sql shell 中试过这个,它也适用于我。但我不能在 pyspark 中使用sparkSession.sql("-- USING HIVE") /* USING HIVE */ 可能会起作用。我能想到 -- USING HIVE 不起作用的唯一原因是它是一个单行注释,但是写一个换行符 ("\n") 或使用多行字符串 ("""-- USING HIVE ... """) 也应该这样做.

以上是关于PySpark 为语法正确的 Hive 查询抛出 ParseException的主要内容,如果未能解决你的问题,请参考以下文章

hive 非正确json格式字段造成查询错误

hive UNION和子查询

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

从 PySpark 查询 Hive 表时出错

从 PySpark 查询远程 Hive Metastore

通过 Pyspark 查询 Hive 返回空结果