데이터 프레임에 컬럼이 존재하는 경우에만 조건 적용

Aug 17 2020

java8과 함께 spark-sql-2.4.1v를 사용하고 있습니다. 주어진 데이터 프레임 열 목록에 열이있는 경우 특정 작업을 수행해야하는 시나리오가 있습니다.

아래의 샘플 데이터 프레임이 있는데, 데이터 프레임의 열은 데이터베이스 테이블에서 실행되는 외부 쿼리에 따라 다릅니다.

val data = List(
  ("20", "score", "school", "2018-03-31", 14 , 12 , 20),
  ("21", "score", "school", "2018-03-31", 13 , 13 , 21),
  ("22", "rate", "school", "2018-03-31", 11 , 14, 22),
  ("21", "rate", "school", "2018-03-31", 13 , 12, 23)
 )

val df = data.toDF("id", "code", "entity", "date", "column1", "column2" ,"column3"..."columnN")

위와 같이 데이터 프레임 "데이터"열은 고정되지 않고 다양하며 "column1", "column2", "column3"... "columnN"...

따라서 열 가용성에 따라 "when-clause"를 사용하려는 동일한 작업을 수행해야합니다. 열이있을 때 지정된 열에 대해 특정 작업을 수행해야하고 그렇지 않으면 다음 작업으로 이동해야합니다.

나는 "when-cluase"를 사용하여 두 가지 방법을 시도하고

첫 번째 방법 :

 Dataset<Row> resultDs =  df.withColumn("column1_avg", 
                     when( df.schema().fieldNames().contains(col("column1")) , avg(col("column1"))))
                     )
 

두 번째 방법 :

  Dataset<Row> resultDs =  df.withColumn("column2_sum", 
                     when( df.columns().contains(col("column2")) , sum(col("column1"))))
                     )

오류:

배열 유형 String []에서 contains (Column)을 호출 할 수 없습니다.

그래서 java8 코드를 사용하여이 시나리오를 처리하는 방법은 무엇입니까?

답변

1 Som Aug 17 2020 at 19:26

모든 열 이름이있는 열을 만들 수 있습니다. 그런 다음 열이 있는지 여부를 확인하고 사용 가능한 경우 처리 할 수 ​​있습니다.

 df.withColumn("columns_available", array(df.columns.map(lit): _*))
      .withColumn("column1_org",
      when( array_contains(col("columns_available"),"column1") , col("column1")))
      .withColumn("x",
        when( array_contains(col("columns_available"),"column4") , col("column1")))
      .withColumn("column2_new",
        when( array_contains(col("columns_available"),"column2") , sqrt("column2")))
      .show(false)