Hive错误:Spark执行中的查询中不支持的语言功能

时间:2017-03-21 15:04:01

标签: hive pyspark apache-spark-sql

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(选择FROM xyz_n ABC其中(a = a)AND(b = b)AND(c = c)

但同一个程序在查询中提供错误"不支持的语言功能"在火花执行中。

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')SELECT a,b,c,d FROM interim_t WHERE NOT EXISTS   (选择一个FROM xyz_n ABC,其中(a = a)AND(b = b)AND(c = c))

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

2 个答案:

答案 0 :(得分:0)

我在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版本是个问题

答案 1 :(得分:0)

我有同样的问题,下面的解决方案适合我。将这些行放在您的文件中并测试: -

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等。