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。你能否提出一些解决方案/替代方案。
答案 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
等。