将HiveQL转换为Spark Scala

将HiveQL转换为Spark Scala,scala,apache-spark,apache-spark-sql,hiveql,window-functions,Scala,Apache Spark,Apache Spark Sql,Hiveql,Window Functions,我想将带有窗口函数的HiveQL查询转换为Scala Spark查询。。。但我经常收到同样的例外 问题背景:mytable由类别和产品字段组成。我想得到每个类别的前N个常用产品列表。下面的DF是一个HiveContext对象 原始查询工作正常: 从中选择类别、产品、频率 选择类别、产品、计数*作为频率, 分区上的行数按类别排序按计数*DESC as seqnum 从mytable按类别分组,产品ci 其中,seqnum您的错误是在orderBy子句中使用aggregate: 如果这样编写,表达式

我想将带有窗口函数的HiveQL查询转换为Scala Spark查询。。。但我经常收到同样的例外

问题背景:mytable由类别和产品字段组成。我想得到每个类别的前N个常用产品列表。下面的DF是一个HiveContext对象

原始查询工作正常:

从中选择类别、产品、频率 选择类别、产品、计数*作为频率, 分区上的行数按类别排序按计数*DESC as seqnum 从mytable按类别分组,产品ci
其中,seqnum您的错误是在orderBy子句中使用aggregate:

如果这样编写,表达式将引入新的聚合表达式。相反,您应该按名称引用现有聚合:

.orderBy("freq")
因此,您的代码应该如下所示:

val w = row_number().over(
  Window.partitionBy("category").orderBy("freq"))
val result = df.select("category", "product")
  .groupBy("category", "product")
  .agg(count("*").as("freq"))
val new_res = result
  .withColumn("seqNum", w).where(col("seqNum") <= 10)
  .drop("seqNum")
val w = row_number().over(
  Window.partitionBy("category").orderBy("freq"))
val result = df.select("category", "product")
  .groupBy("category", "product")
  .agg(count("*").as("freq"))
val new_res = result
  .withColumn("seqNum", w).where(col("seqNum") <= 10)
  .drop("seqNum")