【问题标题】:Hive Error : Unsupported language features in query in Spark executionHive 错误:Spark 执行中的查询中不支持的语言功能
【发布时间】:2017-08-13 08:08:32
【问题描述】:

SQL 查询中 NOT EXISTS 子句的 Spark SQL Hive 错误。

Platform : cdh5.6.0

Hive version: Hive 1.1.0

下面的 NOT EXISTS 查询在 hive 提示符下运行良好: SELECT a,b,c,d FROM interim_t WHERE NOT EXISTS (SELECT a FROM xyz_n ABC where (a=a) AND (b=b) AND (c=c)

但同一程序在 spark 执行中给出错误“查询中不支持的语言功能”。

from pyspark import SparkContext
sc =SparkContext()


from pyspark.sql import HiveContext
sqlContext = HiveContext(sc)

#sqlContext.sql("INSERT INTO abc_p PARTITION (SRVC_TYPE_CD='1') SELECT a,b,c,d FROM interim_t WHERE NOT EXISTS (SELECT a FROM xyz_n ABC where (a=a) AND (b=b) AND (c=c)")

执行:

spark-submit --verbose --deploy-mode client /data/abc.py

错误信息:

查询中不支持的语言功能:INSERT INTO abc_p PARTITION (SRVC_TYPE_CD='1') 从不存在的 interim_t 中选择 a、b、c、d (SELECT a FROM xyz_n ABC where (a=a) AND (b=b) AND (c=c))

我认为 sqlContext.sql 不支持在 hive 查询中不存在。您能否提出一些解决方案/替代方案。

【问题讨论】:

    标签: hive pyspark apache-spark-sql


    【解决方案1】:

    我在下面的 pyspark shell 上尝试过,执行得很好,没有错误。

    from pyspark.sql import HiveContext
    sqlContext = HiveContext(sc)
    
    sqlContext.sql("SELECT a,b,c,d FROM table1 i WHERE  NOT EXISTS  (SELECT a FROM table2 x where i.a=x.a AND i.b=x.b AND i.c=x.c)");
    

    我在 test.py 中有以下内容

    from pyspark import SparkContext
    sc =SparkContext()
    
    from pyspark.sql import HiveContext
    sqlContext = HiveContext(sc)
    
    sqlContext.sql("SELECT a,b,c,d FROM table1 i WHERE  NOT EXISTS  (SELECT a FROM table2 x where i.a=x.a AND i.b=x.b AND i.c=x.c)");
    

    执行脚本

    spark-submit --verbose --deploy-mode client test.py
    

    成功执行。可以试试吗?

    我设置的 Hive 2.1.0 和 Spark 2.0.2

    我怀疑你的配置单元版本是问题

    【讨论】:

    • 是的,可能是 Hive 版本和 Spark 版本的问题。我正在使用平台:cdh5.6.0 Hive 版本:Hive 1.1.0 Spark 版本:1.6。对我来说,当我在 Hive 提示符上执行查询时它正在工作,但在 spark 程序中它给出了错误。
    • 是的,尝试升级 hive 版本并试一试。我对sql做了一些更改,上面的代码应该可以工作
    【解决方案2】:

    我遇到了同样的问题,以下解决方案对我有用。将这些行放入您的文件中并进行测试:-

    from pyspark import SparkContext
    sc =SparkContext()
    from pyspark.sql import HiveContext
    sqlContext = HiveContext(sc)
    
    df = sqlContext.sql("SELECT a,b,c,d FROM interim_t WHERE NOT EXISTS (SELECT a FROM xyz_n ABC where (a=a) AND (b=b) AND (c=c)")
    df.write.mode("overwrite").partitionBy("SRVC_TYPE_CD").saveAsTable("abc_p")
    

    除此之外,您还可以尝试更多选项,例如 mode 可以是 append。您也可以选择保存格式。喜欢mode("xxx").format("parquet")。格式可以是parquet, orc

    【讨论】:

    • 感谢您的回答,但对于平台:cdh5.6.0 Hive 版本:Hive 1.1.0 错误相同“pyspark.sql.utils.AnalysisException:查询中不支持的语言功能:”它不支持不存在。
    猜你喜欢
    • 2014-12-07
    • 2017-09-21
    • 1970-01-01
    • 1970-01-01
    • 2017-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多