org.apache.spark.sql.AnalysisException:无法识别' num'附近的输入':' ' ='在表达规范中;

时间:2018-03-19 01:19:38

标签: mysql json apache-spark-sql

对不起,标题有点长,但准确无误:

我有一个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

1 个答案:

答案 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中被接受并返回我期望的内容。

感谢。