抱歉,标题有点长,但很准确:
我有一个mysql表产品(选择product_id,product_category_id,product_price)要查询以获取每个类别的前3条记录,并且我的查询正在工作,我需要通过执行相同的操作Spark在注册的临时表中:
val query = """
select product_id, product_category_id, product_price
from
(
select product_id, product_category_id, product_price,
(@num:=if(@group = product_category_id, @num +1, if(@group := product_category_id, 1, 1))) row_number
from products t
CROSS JOIN (select @num:=0, @group:=null) c
order by product_category_id, product_price desc, product_id
) as x
where x.row_number <= 3
"""
如果查询是可解析的,我可以得到相同的结果:
val 结果 = sqlContext.sql(query)
但是,我收到了标题中提到的错误:
org.apache.spark.sql.AnalysisException: cannot recognize input near 'num' ':' '=' in expression specification; line 5 pos 11
我可以得出SparkSQL和MySQL之间语法存在一些限制的结论吗?或者我在这里遗漏了什么?你有不同的方法来获取 MySQL 中每组的前 3 条记录吗?
谢谢。
如果你有解决方案并且想在桌面上尝试一下,你可以在这里找到json数据: https://github.com/mdivk/175Scala/blob/master/data/product.json
最佳答案
对于将来阅读本文的任何人:
我相信这是因为 SparkSQL 不支持 @num:=
,我最终得到的是下面使用分区和 row_number 的新查询:
val query = """
select product_id , product_category_id, product_price, row_number() over(partition by product_category_id order by product_price desc) as p_order from products """
这在 SparkSQL 中被接受并返回我所期望的结果。
谢谢。
关于mysql - org.apache.spark.sql.AnalysisException : cannot recognize input near 'num' ':' '=' in expression specification;,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49354514/