2017-10-29 2 views
0

id으로 나눈 스파크를 사용하여 df 열의 문자열 발생을 어떻게 계산합니까?스칼라 스파크 - 데이터 프레임 열의 특정 문자열 카운트

열에서 값 "test" 찾기 SQL에서는 df

"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)name == 'test', null, 그렇지 않으면 1-name 열을 변환하고, count가 null 이외의 값의 수를 제공합니다

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

: 당신의 SQL 쿼리에

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

또는 유사한 :

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")) 
    ) 
} 
관련 문제