2017-10-29 253 views
0

如何计算df列中使用Spark分区的字符串出现次数idScala Spark - 计算Dataframe列中特定字符串的出现

例如在列查找值"test"df

在SQL "name"是:

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

这是一个:

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

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

之类的东西尝试昂贵的操作?检查特定字符串出现的最佳方法是什么?然后执行一个操作(sum, max, min, etc)

感谢

+0

没有任何回答帮助你的?如果是,请接受它 –

回答

4

您可以使用groupBy火花+ agg;这里when($"name" == "test", 1)转变name1如果name == 'test'null否则,和count给非空值的计数:

df.groupBy("id").agg(count(when($"name" === "test", 1)).as("cnt_test")) 

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| 
+---+--------+ 

或类似的SQL查询:

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

如果你想翻译你的SQL,你可以也窗口函数在星火还有:

def getCount(df: DataFrame): DataFrame = { 
    import org.apache.spark.sql.expressions.Window 

    df.withColumn("cnt_test", 
     sum(when($"name" === "test", 1).otherwise(0)).over(Window.partitionBy($"id")) 
    ) 
} 
相关问题