2016-11-23 2 views
0

Spark SQL을 사용하여 만든 하나의 UDF [udf]을 호출하려고하는 Spark SQL DF가 있습니다. Spark SQL DataFrame에서 UDF 메서드 내의 다른 메서드/변수 호출

val udfName = udf(somemethodName) 
val newDF = df.withColumn("columnnew", udfName(col("anotherDFColumn")) 

은 내가 somemethodName 내부 val로 저장 다른 DF를 사용하기 위해 노력하고있어,하지만 DF는 널오고있다.

여기는 newDF에서 where 절을 사용하는 경우에만 발생합니다.

누락 된 것이 있습니까? UDF 메서드 내에서 다른 변수/메서드를 사용할 수 있습니까?

아니면 방송으로해야합니까? 현재 나는 클러스터에서가 아니라 로컬에서 이것을 실행하고 있습니다. 단지 그 변수/메소드는 직렬화 될 수 있다면 경우

답변

1

UDF 방법 내부에 또 다른 변수/메소드를 사용할 수 없습니다

그것은 수는 -, UDF는 폐쇄입니다 반드시 집행자에게 연재되어 배포되어야합니다. 당신은 UDF를 사용하려고하면 Dataframe (이것은 다른 분산 데이터에 대한 포인터, 그래서 드라이버 메모리에를 수집하지 않고 직렬화 할 논리적 방법이 없습니다) 직렬화 할 수없는

따라서 null으로 나타납니다.

아마도 일부 키에 두 개의 데이터 프레임이 join 필요하고, 조인 된 Dataframe에서 열을 가져 오는 UDF (또는 표준 변환)를 사용하게 될 것입니다.

+1

실제로'Dataset' /'Dataframe'을 직렬화 할 수 있습니다. UDF 종결에는 사용할 수 없습니다. –

+0

@Tzach Zohar : 데이터 프레임간에 공통 키가 없으므로 다른 데이터 프레임은 조인 할 수 없습니다. 0 ~ 60과 같은 일부 범위 값이 있습니다. 어떻게 UDF 내부에서 조회를 사용할 수 있습니까? 내가 udf 메서드 내에서 조회 파일을 읽을 수 있기를 바랍니다. 그러나 각 레코드마다 전체 파일을로드해야합니다. – Shankar

+0

@LostInOverflow : UDF 메서드 이름 외부에 정의 된 List를 사용할 수 있습니까? 나는 파일에서 범위를 읽고 목록을 작성한 다음 UDF 메서드 내에서 목록을 사용할 계획입니다. 작동할까요? – Shankar

관련 문제