Scala Spark - 计算Dataframe列中特定字符串的出现
问题描述:
如何计算df
列中使用Spark分区的字符串出现次数id
?Scala 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)
?
感谢
答
您可以使用groupBy
火花+ agg
;这里when($"name" == "test", 1)
转变name
列1
如果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|
+---+--------+
答
如果你想翻译你的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"))
)
}
没有任何回答帮助你的?如果是,请接受它 –