복붙노트

[SCALA] 기존 DataFrame 사용 withColumn에 두 개의 열을 추가

SCALA

기존 DataFrame 사용 withColumn에 두 개의 열을 추가

나는 약간 열이있는 DataFrame 있습니다. 지금은 기존 DataFrame에 두 개의 열을 추가하고 싶습니다.

현재 내가 DataFrame이 사용 withColumn 방법을하고있는 중이 야.

예를 들어 :

df.withColumn("newColumn1", udf(col("somecolumn")))
  .withColumn("newColumn2", udf(col("somecolumn")))

실제로 I는 어레이 [문자열]을 사용하여 단일 UDF 방법 모두 newcoOlumn 값을 반환 할 수있다. 그러나 현재이 내가 그 일을하고 방법이다.

어쨌든, 나는 효과적으로 할 수 있습니까? 좋은 옵션이 여기에 폭발한다 사용하고 계십니까?

내가 사용은 폭발에, 내가 한 번 withColumn를 사용해야 할 경우에도, 그 다음 다음 폭발이 더 많은 열을 생성하여, Array와 같은 열 값 [문자열]을 반환합니다.

어느 쪽이 효과적이다? 또는 대안이 무엇입니까?

해결법

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

    1.AFAIK 당신이 (각각의 새로운 칼럼에 대해 한 번)를 두 번 withColumn를 호출해야합니다. 당신의 UDF는 계산 비용이 높은 경우에, 당신은 예를 들어, 결과를 "풀기"다음 임시 열에서 "복잡한"결과를 저장하고로 두 번 전화를 피할 수 있습니다 (배열 요소에 대한 액세스를 제공) 칼럼의 적용 방법을 사용. 때때로 중간 결과를 캐시하는 데 필요한 주 때로는 필요하지 않을 것, (UDF에 포장 풀기 동안 두 번 행마다 호출되는 것을 방지하기 위해). 이것은 계획을 최적화하는 방법 스파크에 의존하는 것 같다 :

    AFAIK 당신이 (각각의 새로운 칼럼에 대해 한 번)를 두 번 withColumn를 호출해야합니다. 당신의 UDF는 계산 비용이 높은 경우에, 당신은 예를 들어, 결과를 "풀기"다음 임시 열에서 "복잡한"결과를 저장하고로 두 번 전화를 피할 수 있습니다 (배열 요소에 대한 액세스를 제공) 칼럼의 적용 방법을 사용. 때때로 중간 결과를 캐시하는 데 필요한 주 때로는 필요하지 않을 것, (UDF에 포장 풀기 동안 두 번 행마다 호출되는 것을 방지하기 위해). 이것은 계획을 최적화하는 방법 스파크에 의존하는 것 같다 :

    val myUDf = udf((s:String) => Array(s.toUpperCase(),s.toLowerCase()))
    
    val df = sc.parallelize(Seq("Peter","John")).toDF("name")
    
    val newDf = df
      .withColumn("udfResult",myUDf(col("name"))).cache 
      .withColumn("uppercaseColumn", col("udfResult")(0))
      .withColumn("lowercaseColumn", col("udfResult")(1))
      .drop("udfResult")
    
    newDf.show()
    

    제공

    +-----+---------------+---------------+
    | name|uppercaseColumn|lowercaseColumn|
    +-----+---------------+---------------+
    |Peter|          PETER|          peter|
    | John|           JOHN|           john|
    +-----+---------------+---------------+
    

    UDF는 튜플을 반환으로, 압축 풀기는 다음과 같이 보일 것이다 :

    val newDf = df
        .withColumn("udfResult",myUDf(col("name"))).cache
        .withColumn("lowercaseColumn", col("udfResult._1"))
        .withColumn("uppercaseColumn", col("udfResult._2"))
        .drop("udfResult")
    
  2. from https://stackoverflow.com/questions/40959655/adding-two-columns-to-existing-dataframe-using-withcolumn by cc-by-sa and MIT license