Scala Spark - 计算Dataframe列中特定字符串的出现次数

Lou*_*_Ds 2 scala aggregate dataframe window-functions apache-spark

如何df使用分区的Spark计算列中String的出现次数id

例如,找到a "test""name"中的值df

在SQL中将是:

 SELECT
    SUM(CASE WHEN name = 'test' THEN 1 else 0 END) over window AS cnt_test
  FROM
    mytable
 WINDOW window AS (PARTITION BY id)
Run Code Online (Sandbox Code Playgroud)

我试过用了 map( v => match { case "test" -> 1.. })

和类似的东西:

def getCount(df: DataFrame): DataFrame = {
    val dfCnt = df.agg(
          .withColumn("cnt_test", 
            count(col("name")==lit('test'))
)
Run Code Online (Sandbox Code Playgroud)

这是一项昂贵的操作吗?什么是检查特定字符串出现然后执行操作的最佳方法(sum, max, min, etc)

谢谢

Psi*_*dom 8

你可以在火花中使用groupBy+ agg; 这里when($"name" == "test", 1)name列转换为1if name == 'test',null否则,并count给出非空值的计数:

df.groupBy("id").agg(count(when($"name" === "test", 1)).as("cnt_test"))
Run Code Online (Sandbox Code Playgroud)

示例:

val df = Seq(("a", "joe"), ("b", "test"), ("b", "john")).toDF("id", "name")
df.groupBy("id").agg(count(when($"name" === "test", 1)).as("cnt_test")).show
+---+--------+
| id|cnt_test|
+---+--------+
|  b|       1|
|  a|       0|
+---+--------+
Run Code Online (Sandbox Code Playgroud)

或者类似于你的SQL查询:

df.groupBy("id").agg(sum(when($"name" === "test", 1).otherwise(0)).as("cnt_test")).show
+---+--------+
| id|cnt_test|
+---+--------+
|  b|       1|
|  a|       0|
+---+--------+
Run Code Online (Sandbox Code Playgroud)