2017-05-11 12 views
0
val trim: String => String = _.trim.replace("[\\r\\n]", "") 

def main(args: Array[String]) {  
    val spark = ... ... 
    import spark.implicits._  
    val trimUDF = udf[String,String](trim) 

    val df = spark.read.json(df_path) ...  
    val fixed_dblogs_df = df.withColumn("qp_new", trimUDF('qp)) ... 
} 

이 TypeTag 오류를 제공합니다. 왜 이런 일이 일어나는지 모르겠습니다. 이전에 udf 함수를 사용했지만이 오류가 발생했습니다. 나는 Spark 2.1.1을 사용했다.제거 줄 바꿈 내가 컴파일 시간 오류가이 코드를 실행하면

코드의 목적은

+0

재현 가능한 예를 보여주세요 – mtoto

+0

함수를'trim'으로 정의했지만 udf에서는'betterTrimmer'를 사용하고 있습니까? – Psidom

+0

죄송합니다. 읽을 수 있도록 일부 줄을 제거하고 일부 변수의 이름을 변경했습니다. 난 그냥 문자열 형식의 필드가있는 데이터 프레임을 읽고 난 그 문자열 필드에있는 라인의 끝을 제거하고 싶습니다. 나는 또한 트림 기능을 수정했습니다. –

답변

1

사용중인 몇 가지 이유가 StringType이고 난 그냥 그것의 모든 줄 바꿈을하지 원하는 열 내 필드 중 하나에 모든 새로운 라인을 제거하는 것입니다 replace_regexp 대신 UDF가 내장되어 있습니까?

val fixed_dblogs_df = df.withColumn("qp_new", replace_regexp('qp, "[\\r\\n]", "") ...) 

UDF의 break Spark의 계획 최적화.

+0

해답을 주셔서 감사합니다 나는 그것을 테스트합니다 그러나 왜 udf가이 오류를 특별히 내게주고 있기 때문에 나는이 문자열의 스키마를 얻으려면 훨씬 더 많은 것을 위해 udf를 사용하고 있습니다. –

+0

udf 분리 최적화에 대한 참조가 있고 열 조작에 적합한 방법은 무엇입니까? –

+0

Cloudera 블로그 : "주목할 스파크 SQL의 또 다른 중요한 구성 요소는 카탈리스트 쿼리 옵티 마이저입니다. 그 기능은 매 릴리스마다 확장되어 있으며 스파크 SQL 쿼리의 성능을 대폭 향상시킬 수 있지만 임의의 UDF 구현 코드는 (비록 바이트 코드를 분석하는 미래의 기능이 이것을 다루기 위해 고려되고 있지만) Spark의 내장 SQL 쿼리 기능을 사용하면 성능이 가장 좋아질 수 있으며 ** 언제든지 ** 고려해야 할 첫 번째 접근 방식이되어야합니다 UDF를 도입하는 것을 피할 수 있습니다. " – halversonp