2017-12-11 9 views
0

I는 방송 변수로 배열을하고 정수 포함은 새로운 열의 가치를 추가

broadcast_array.value 
Array(72159153, 72159163, 72159202, 72159203, 72159238, 72159398, 72159447, 72159448, 72159455, 72159492... 

I 데이터 집합의 열을을 (호출은 broadcast_array에있을 수 있습니다 IntegerType 값을 포함 col_id이지만, 그들은하지 않을 수 있습니다. 나는 각 행에 대해 col_id 값이 broadcast_array에 있는지 확인하는 새 열을합니다 (new_col 전화) 만들려고하고

. 그렇다면 새 열 값은

val my_new_df = df.withColumn("new_col", when(broadcast_array.value.contains($"col_id"), "Available"))

하지만이 오류가 점점 계속 :이 null

그래서 내가 좋아하는 뭔가를 할 수있다, 다른 Available

Name: Unknown Error 
Message: <console>:45: error: type mismatch; 
found : Boolean 
required: org.apache.spark.sql.Column 
    val my_new_df = df.withColumn("new_col", when(broadcast_array.value.contains($"col_id"), "Available")) 
                         ^
StackTrace: 

나에게 가장 혼란 어떤 것은 그 I when 문에 일부 부울을 출력하는 조건부가 필요하다고 생각했지만 여기에는 Column이 필요하다는 것을 의미합니다.

기존 열의 값을 미리 정의 된 Array에서 찾을 수 있는지 여부에 따라 새 열에 값을 추가하는 방법은 무엇입니까?

답변

1

당신이 when 기능

def when(condition : org.apache.spark.sql.Column, value : scala.Any) : org.apache.spark.sql.Column

API를 보면 그것의 필요 조건이 열이 아닌 부울이다 명확 있다.

그래서 당신은

import org.apache.spark.sql.functions._ 
df.withColumn("new_col", when(lit(broadcast_array.value.mkString(",")).contains($"col_id"), lit("Available"))).show(false) 

또는

columnboolean를 변환하는 복잡한 lit 조합을 할 수

당신은

import org.apache.spark.sql.functions._ 
val broadcastContains = udf((id: Int) => broadcast_array.value.contains(id)) 
로 간단한 udf 기능을 작성하여 당신이 시도하고있는 무슨 달성 할 수

을 호출하고이 함수를

df.withColumn("new_col", when(broadcastContains($"col_id"), lit("Available"))).show(false)