【问题标题】:PySpark throwing ParseException for syntactical correct Hive QueryPySpark 为语法正确的 Hive 查询抛出 ParseException
【发布时间】: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 支持似乎仍然不起作用。

标签: apache-spark hive pyspark hiveql


【解决方案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 ... """) 也应该这样做.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-04
  • 2014-07-17
  • 2021-10-16
  • 1970-01-01
相关资源
最近更新 更多