2017-10-29 11 views
0

idでスパークを使用してdf列にある文字列の出現を数えますか?Scala Spark - Dataframe列の特定の文字列の出現をカウントします。

列の値"test"を探すSQLでdf

"name"は次のようになります。

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

このANです:

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を使用することができます

おかげ

+0

は、任意の答えはあなたを助けたのでしょうか?はいの場合はそれを受け入れてください –

答えて

4

。ここでname == 'test'場合when($"name" == "test", 1)はそうnull1name列を変換し、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")) 
    ) 
} 
関連する問題