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)?
谢谢
你可以在火花中使用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)
| 归档时间: |
|
| 查看次数: |
4927 次 |
| 最近记录: |