[HADOOP] UDF에서 spark sql 쿼리를 실행하려고합니다.
HADOOPUDF에서 spark sql 쿼리를 실행하려고합니다.
스칼라 프레임 워크에서 문자열 입력을 받아 SQL 문을 실행하고 String 값을 반환하는 스칼라를 사용하여 인라인 함수를 작성하려고합니다.
val testfunc: (String=>String)= (arg1:String) =>
{val k = sqlContext.sql("""select c_code from r_c_tbl where x_nm = "something" """)
k.head().getString(0)
}
이 스칼라 함수를 UDF로 등록하려고합니다.
val testFunc_test = udf(testFunc)
하이브 테이블을 통해 데이터 프레임이 있습니다.
val df = sqlContext.table("some_table")
그런 다음 withColumn에서 udf를 호출하고 새로운 데이터 프레임에 저장하려고합니다.
val new_df = df.withColumn("test", testFunc_test($"col1"))
하지만 매번 이걸 시도하면 에러가 난다.
16/08/10 21:17:08 WARN TaskSetManager: Lost task 0.0 in stage 1.0 (TID 1, 10.0.1.5): java.lang.NullPointerException
at org.apache.spark.sql.execution.SQLExecution$.withNewExecutionId(SQLExecution.scala:41)
at org.apache.spark.sql.DataFrame.withNewExecutionId(DataFrame.scala:2086)
at org.apache.spark.sql.DataFrame.foreach(DataFrame.scala:1434)
나는 비교적 새로운 스파크와 스칼라입니다. 그러나 왜이 코드가 실행되지 않아야하는지 잘 모르겠습니다. 모든 통찰력이나 해결 방법은 높이 평가 될 것입니다.
전체 오류 스택을 붙여 넣지 않았습니다. 필요한 경우 알려 주시기 바랍니다.
해결법
-
==============================
1.UDF에서 sqlContext를 사용할 수 없습니다. UDF는 실행 프로그램에 전달할 수 있도록 직렬화 가능해야하며 컨텍스트 (클러스터에 연결할 수 있다고 생각할 수 있음)는 직렬화하여 노드로 보낼 수 없습니다. 드라이버 만 (UDF가 정의되었지만 실행되지 않은) 응용 프로그램은 sqlContext를 사용할 수 있습니다.
UDF에서 sqlContext를 사용할 수 없습니다. UDF는 실행 프로그램에 전달할 수 있도록 직렬화 가능해야하며 컨텍스트 (클러스터에 연결할 수 있다고 생각할 수 있음)는 직렬화하여 노드로 보낼 수 없습니다. 드라이버 만 (UDF가 정의되었지만 실행되지 않은) 응용 프로그램은 sqlContext를 사용할 수 있습니다.
귀하의 유스 케이스 (테이블 Y에서 레코드 당 테이블 X 선택을 수행)가 조인을 사용하여 더 잘 수행 될 것입니다.
from https://stackoverflow.com/questions/38912359/trying-to-execute-a-spark-sql-query-from-a-udf by cc-by-sa and MIT license
'HADOOP' 카테고리의 다른 글
[HADOOP] aws의 스파크 스텝 종료 (0) | 2019.07.12 |
---|---|
[HADOOP] hbase에서 미리 분할하는 방법 (0) | 2019.07.12 |
[HADOOP] 하둡에 대한 경험이 있으십니까? (0) | 2019.07.12 |
[HADOOP] Windows의 Hadoop 오류 : java.lang.UnsatisfiedLinkError (0) | 2019.07.12 |
[HADOOP] cygwin에서 간단한 map-reduce hadoop 예제를 실행하는 데 문제가 있음 (0) | 2019.07.12 |