Spark 找不到窗口函数

Posted

技术标签:

【中文标题】Spark 找不到窗口函数【英文标题】:Spark Couldn't Find Window Function 【发布时间】:2015-10-02 10:42:00 【问题描述】:

使用https://***.com/a/32407543/5379015中提供的解决方案 我尝试重新创建相同的查询,但使用编程语法而不是 Dataframe API,如下所示:

import org.apache.spark.SparkContext, SparkConf
import org.apache.spark.sql.hive.HiveContext
import org.apache.spark.sql.expressions.Window
import org.apache.spark.sql.functions._

object HiveContextTest 
  def main(args: Array[String]) 
    val conf = new SparkConf().setAppName("HiveContextTest")
    val sc = new SparkContext(conf)
    val sqlContext = new HiveContext(sc)
    import sqlContext.implicits._

    val df = sc.parallelize(
      ("foo", 1) :: ("foo", 2) :: ("bar", 1) :: ("bar", 2) :: Nil
    ).toDF("k", "v")


    // using dataframe api works fine

    val w = Window.partitionBy($"k").orderBy($"v")
    df.select($"k",$"v", rowNumber().over(w).alias("rn")).show


    //using programmatic syntax doesn't work

    df.registerTempTable("df")
    val w2 = sqlContext.sql("select k,v,rowNumber() over (partition by k order by v) as rn from df")
    w2.show()

  

第一个df.select($"k",$"v", rowNumber().over(w).alias("rn")).show 工作正常,但w2.show() 结果

Exception in thread "main" org.apache.spark.sql.AnalysisException: Couldn't find window function rowNumber;

是否有人对我如何使用编程语法进行这项工作有任何想法?非常感谢。

【问题讨论】:

【参考方案1】:

rowNumber 的 SQL 等效项是 row_number

SELECT k, v, row_number() OVER (PARTITION BY k ORDER BY v) AS rn FROM df

【讨论】:

以上是关于Spark 找不到窗口函数的主要内容,如果未能解决你的问题,请参考以下文章

Spark窗口函数应用(-)

Spark SQL 中分组依据和窗口函数如何交互?

没有 orderBy 的 Spark 窗口函数

休眠和窗口函数

Spark SQL:窗口函数滞后直到满足条件

Spark窗口(开窗)函数--博客园