2017-10-29 254 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")) 
    ) 
} 
相關問題