복붙노트

[HADOOP] UDF에서 spark sql 쿼리를 실행하려고합니다.

HADOOP

UDF에서 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. ==============================

    1.UDF에서 sqlContext를 사용할 수 없습니다. UDF는 실행 프로그램에 전달할 수 있도록 직렬화 가능해야하며 컨텍스트 (클러스터에 연결할 수 있다고 생각할 수 있음)는 직렬화하여 노드로 보낼 수 없습니다. 드라이버 만 (UDF가 정의되었지만 실행되지 않은) 응용 프로그램은 sqlContext를 사용할 수 있습니다.

    UDF에서 sqlContext를 사용할 수 없습니다. UDF는 실행 프로그램에 전달할 수 있도록 직렬화 가능해야하며 컨텍스트 (클러스터에 연결할 수 있다고 생각할 수 있음)는 직렬화하여 노드로 보낼 수 없습니다. 드라이버 만 (UDF가 정의되었지만 실행되지 않은) 응용 프로그램은 sqlContext를 사용할 수 있습니다.

    귀하의 유스 케이스 (테이블 Y에서 레코드 당 테이블 X 선택을 수행)가 조인을 사용하여 더 잘 수행 될 것입니다.

  2. from https://stackoverflow.com/questions/38912359/trying-to-execute-a-spark-sql-query-from-a-udf by cc-by-sa and MIT license