복붙노트

[SCALA] 아파치 스파크는 기존 DataFrame에 "CASE ... ELSE ..."계산 된 열을 추가

SCALA

아파치 스파크는 기존 DataFrame에 "CASE ... ELSE ..."계산 된 열을 추가

나는 스칼라 API를 사용하여 기존 DataFrame에 열을 계산 된 "ELSE ... CASE"을 추가하기 위해 노력하고있어. dataframe 시작 :

color
Red
Green
Blue

원하는 dataframe (SQL 구문 : CASE 색 == 그린 THEN BOOL AS 1 ELSE 0 END)

color bool
Red   0
Green 1
Blue  0

어떻게하면이 논리를 구현해야합니까?

해결법

  1. ==============================

    1.곧 SPARK 1.4.0 릴리스 (며칠에 발표해야한다). 당신은 때 / 다른 구문을 사용할 수 있습니다 :

    곧 SPARK 1.4.0 릴리스 (며칠에 발표해야한다). 당신은 때 / 다른 구문을 사용할 수 있습니다 :

    // Create the dataframe
    val df = Seq("Red", "Green", "Blue").map(Tuple1.apply).toDF("color")
    
    // Use when/otherwise syntax
    val df1 = df.withColumn("Green_Ind", when($"color" === "Green", 1).otherwise(0))
    

    당신이 SPARK 1.3.0을 사용하는 경우에는 UDF를 사용하도록 선택할 수 있습니다 :

    // Define the UDF
    val isGreen = udf((color: String) => {
      if (color == "Green") 1
      else 0
    })
    val df2 = df.withColumn("Green_Ind", isGreen($"color"))
    
  2. ==============================

    2.스파크 1.5.0에서 : 당신은 또한 SQL 구문 EXPR 기능을 사용할 수 있습니다

    스파크 1.5.0에서 : 당신은 또한 SQL 구문 EXPR 기능을 사용할 수 있습니다

    val df3 = df.withColumn("Green_Ind", expr("case when color = 'green' then 1 else 0 end"))
    

    또는 일반 스파크-SQL

    df.registerTempTable("data")
    val df4 = sql(""" select *, case when color = 'green' then 1 else 0 end as Green_ind from data """)
    
  3. ==============================

    3.나는 이것을 찾았다:

    나는 이것을 찾았다:

    https://issues.apache.org/jira/browse/SPARK-3813

    스파크 2.1.0에 나를 위해 일한 :

    import sqlContext._
    val rdd = sc.parallelize((1 to 100).map(i => Record(i, s"val_$i")))
    rdd.registerTempTable("records")
    println("Result of SELECT *:")
    sql("SELECT case key when '93' then 'ravi' else key end FROM records").collect()
    
  4. ==============================

    4.내가 지금 여기에 오랫동안 찾고 있던 것은 다른 자바 사용자를위한 부산물 그룹 SPARK 2.1 자바의 예입니다.

    내가 지금 여기에 오랫동안 찾고 있던 것은 다른 자바 사용자를위한 부산물 그룹 SPARK 2.1 자바의 예입니다.

    import static org.apache.spark.sql.functions.*;
     //...
        Column uniqTrue = col("uniq").equalTo(true);
        Column uniqFalse = col("uniq").equalTo(false);
    
        Column testModeFalse = col("testMode").equalTo(false);
        Column testModeTrue = col("testMode").equalTo(true);
    
        Dataset<Row> x = basicEventDataset
                .groupBy(col(group_field))
                .agg(
                        sum(when((testModeTrue).and(uniqTrue), 1).otherwise(0)).as("tt"),
                        sum(when((testModeFalse).and(uniqTrue), 1).otherwise(0)).as("ft"),
                        sum(when((testModeTrue).and(uniqFalse), 1).otherwise(0)).as("tf"),
                        sum(when((testModeFalse).and(uniqFalse), 1).otherwise(0)).as("ff")
                );
    
  5. from https://stackoverflow.com/questions/30783517/apache-spark-add-an-case-when-else-calculated-column-to-an-existing-d by cc-by-sa and MIT license