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的主要内容,如果未能解决你的问题,请参考以下文章