데이터 프레임에 컬럼이 존재하는 경우에만 조건 적용
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
모든 열 이름이있는 열을 만들 수 있습니다. 그런 다음 열이 있는지 여부를 확인하고 사용 가능한 경우 처리 할 수 있습니다.
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)