2

나는 스파크에서 룩업 테이블로 사용하고자하는 명확하게 정의 된 스키마가없는 데이터 프레임을 가지고 있습니다. 예를 들어, 아래 dataframe는 :Spark에서 찾아보기 테이블

+------------------------------------------------------------------------+ 
|lookupcolumn               | 
+------------------------------------------------------------------------+ 
|[val1,val2,val3,val4,val5,val6]           | 
+------------------------------------------------------------------------+ 

스키마는 다음과 같이 보일 것이다 :

는 말인지
|-- lookupcolumn: struct (nullable = true) 
| |-- key1: string (nullable = true) 
| |-- key2: string (nullable = true) 
| |-- key3: string (nullable = true) 
| |-- key4: string (nullable = true) 
| |-- key5: string (nullable = true) 
| |-- key6: string (nullable = true) 

"스키마는 명확하게 정의되지"키의 수를 알 수 있기 때문에 데이터가되는 동안 읽기 때문에 Spark에 스키마 유추를 맡깁니다. 나는 아래와 같이 열이 다른 dataframe이있는 경우

지금, :

+-----------------+ 
|  datacolumn| 
+-----------------+ 
|   key1 | 
|   key3 | 
|   key5 | 
|   key2 | 
|   key4 | 
+-----------------+ 

나는 결과가되고 싶어요 :

val get_val = udf((keyindex: String) => { 
    val res = lookupDf.select($"lookupcolumn"(keyindex).alias("result")) 
    res.head.toString 
}) 
:
+-----------------+ 
|  resultcolumn| 
+-----------------+ 
|   val1 | 
|   val3 | 
|   val5 | 
|   val2 | 
|   val4 | 
+-----------------+ 

내가 이런 UDF 시도

그러나 Null 포인터 예외 오류가 발생합니다.

누군가가 UDF의 문제점을 말해 줄 수 있습니까? Spark에서이 룩업을 더 잘/더 쉽게 수행 할 수있는 방법이 있습니까?

+0

은 조회 데이터 프레임이 하나의 행 또는 다중 행입니까? –

+0

행이 하나뿐입니다. 키와 값을 다른 열로 여러 행으로 분해하여 조인을 할 수 있다면 더 쉬울 것이라고 생각합니다. 그러나 조인을 수행하는 방법은 확실하지 않습니다. –

+0

음, 아니. 결과 열은 값을 가지며 datacolumn에는 키가 있습니다. –

답변

0

룩업 테이블이 매우 작다고 가정합니다.이 경우 드라이버에 수집하여 보통 Map으로 변환하는 것이 좋습니다. 그런 다음 UDF 함수에이 Map을 사용합니다.

val lookup = udf((key: String) => lookup_map.get(key)) 

그리고 마지막 dataframe 방법 : : 위의 lookup_map 변수를 사용하여

val values = lookupDf.select("lookupcolumn.*").head.toSeq.map(_.toString) 
val keys = lookupDf.select("lookupcolumn.*").columns 
val lookup_map = keys.zip(values).toMap 

UDF 간단하게 될 것입니다 : 다음과 같은 예를 들어, 여러 방법으로 수행 할 수 있습니다

val df2 = df.withColumn("resultcolumn", lookup($"datacolumn")) 
+0

감사합니다. 그러나 키가 테이블에 없을 때 UDF가 null을 반환하도록하는 방법이 있습니까? 현재 오류가 발생합니다. –

+0

@PramodKumar : 가능합니다. udf를 약간 변경했는데, 키가 존재하지 않으면 null을 리턴해야합니다. 'get()'을'getOrElse()'로 변경하여 기본값을 반환하는 것도 가능합니다. – Shaido