对不起,标题有点长,但准确无误:
我有一个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 result = sqlContext.sql(query)
但是,我收到了标题中提到的错误:
org.apache.spark.sql.AnalysisException:无法识别附近的输入 &#39; NUM&#39; &#39;:&#39; &#39; =&#39;在表达规范中;第5行pos 11
我可以得出结论,SparkSQL和MySQL之间的语法有一些限制吗?或者我在这里遗漏了什么?你有不同的方法来获取MySQL中每组的前三条记录吗?
谢谢。
如果你有一个解决方案并希望在桌面上试一试,你可以在这里找到json数据: https://github.com/mdivk/175Scala/blob/master/data/product.json
答案 0 :(得分:0)
对于将来阅读此内容的任何人:
我相信这是因为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中被接受并返回我期望的内容。
感谢。