Sql SPARK:失败:应为“联合”,但找到了“(”

Sql SPARK:失败:应为“联合”,但找到了“(”,sql,scala,apache-spark,dataframe,apache-spark-sql,Sql,Scala,Apache Spark,Dataframe,Apache Spark Sql,我有一个名为df的数据帧,列名为employee_id。我正在做: df.registerTempTable("d_f") val query = """SELECT *, ROW_NUMBER() OVER (ORDER BY employee_id) row_number FROM d_f""" val result = Spark.getSqlContext().sql(query) 但是得到以下问题。有什么帮助吗 [1.29] failure: ``union'' expected

我有一个名为df的数据帧,列名为employee_id。我正在做:

 df.registerTempTable("d_f")
val query = """SELECT *, ROW_NUMBER() OVER (ORDER BY employee_id) row_number FROM d_f"""
val result = Spark.getSqlContext().sql(query)
但是得到以下问题。有什么帮助吗

[1.29] failure: ``union'' expected but `(' found
SELECT *, ROW_NUMBER() OVER (ORDER BY employee_id) row_number FROM d_f
                            ^
java.lang.RuntimeException: [1.29] failure: ``union'' expected but `(' found
SELECT *, ROW_NUMBER() OVER (ORDER BY employee_id) row_number FROM d_f
火花2.0+

Spark 2.0引入了窗口函数的本机实现,因此不再需要HiveContext。尽管如此,与窗口函数无关的类似错误仍然可以归因于SQL解析器之间的差异

火花是的,这是真的

我使用的是spark版本1.6.0,您需要一个HiveContext来实现“稠密排名”方法

从Spark 2.0.0开始,单词将不再有“密集等级”方法


因此,对于Spark 1.4,1.6,如果直接在Db中运行,查询是否有效?选择t.*,行号大于按员工排序的行号,从d_f中选择行号作为tQuery就可以了。您在其他部分遇到了错误,而不是在这里。发布完整的查询。@Praveen,在这里对表进行别名处理将是一个什么样的解决方案?@Praveen,我没有测试,但从逻辑上讲,它不应该是正确的案例。由于查询只涉及一个表别名,因此根本不需要;换句话说,DB引擎不会对引用产生歧义。sc是SparkContext。但是为什么窗口函数需要HiveContext?HiveContext和SQLContext之间有什么区别?@DanielDarabos在这种特殊情况下,它只是关于支持者的t表示配置单元UDAFs。Spark<2.0.0中的所有窗口函数都使用配置单元UDAF表示,因此没有HiveContext无法工作。我明白了,谢谢!也感谢您更新答案。我添加了到的链接。
import org.apache.spark.sql.hive.HiveContext
val sqlContext = new HiveContext(sc)
val sc = new SparkContext(conf)
val sqlContext = new SQLContext(sc)
val hqlContext = new org.apache.spark.sql.hive.HiveContext(sc)