2017-01-27 3 views
2

열 A - Z가있는 데이터 프레임이 있고 다른 열 값이 null 인 경우 Z 값을 할당하고 싶습니다. withColumn 방법 내부의 모든 다른 열을 반복하는 더 간결한 방법이 있나요데이터 프레임의 다른 모든 열을 반복하여 열의 값을 결정합니다.

val df2 = df1.withColumn("Z", 
    when(col("A") === lit(null), lit("Y")) 
    .when(col("B") === lit(null), lit("Y")) 
    .when(col("C") === lit(null), lit("Y")) 
    ... 
    ... 
    .when(col("Y") === lit(null), lit("Y")) 
    .otherwise(lit("N"))); 

: 나는이 작업을 수행 할 수 있습니다?

답변

0

는 사실은 내가 272 열이 그냥`A-Z`하는 것은 내가 편의상 넣었다은없는, 나는이 함께 시도 spark.sql.functions 패키지

val df2 = df1 
    .withColumn("Z",when(array_contains(array(df1.columns.map(c=>lower(col(c))):_*),"null"),lit("Y")).otherwise(lit("N"))) 
0

예, withColumns 내에서 열을 반복하고 논리적 표현 foldLeft를 사용할 수 있습니다

val df2 = df1.withColumn("Z", 
     when(
     df.columns 
      .filter(name => name.matches("[A-Z]")) // only take these column names 
      .map(name => col(name)) // maps String to Column 
      .foldLeft(lit(false))((acc, current) => when(acc or current.isNull, lit(true)).otherwise(lit(false))) 
     , lit("Y")) 
     .otherwise(lit("N")) 
    ) 

테스트 :

입력 :

+---+----+----+ 
| A| B| C| 
+---+----+----+ 
| 1| 2| 3| 
| 1|null| 3| 
| 1|null|null| 
+---+----+----+ 

출력 :

+---+----+----+---+ 
| A| B| C| Z| 
+---+----+----+---+ 
| 1| 2| 3| N| 
| 1|null| 3| Y| 
| 1|null|null| Y| 
+---+----+----+---+ 
+0

을 탐구하여이를 달성했다. 따라서 150 만 행의 데이터 세트에서 foldLeft가 작동하지 않으면 종료하기 전에 5 시간 동안 계속 작동합니다. – Gsquare

관련 문제