2016-12-27 2 views
1

내가 가지고있는 데이터를 처리하기 전에 스키마를 추출하기 때문에 데이터 집합을 읽을 때 스키마를 추정하는 비싼 단계를 거치지 않고 스키마를 제공합니다. 스키마를 구축하기 위해중복되지 않은 Spark 스키마 결합?

, 나는 최종 스키마로 여러 가지 다른 스키마에 병합해야, 그래서 나는 union (++)distinct 방법을 사용하여왔다,하지만 난 org.apache.spark.sql.AnalysisException: Duplicate column(s) 예외를 점점 계속.

val schema1 = StructType(StructField("A", StructType(
    StructField("i", StringType, true) :: Nil 
    ), true) :: Nil) 

val schema2 = StructType(StructField("A", StructType(
    StructField("i", StringType, true) :: Nil 
    ), true) :: Nil) 

val schema3 = StructType(StructField("A", StructType(
    StructField("i", StringType, true) :: 
    StructField("ii", StringType, true) :: Nil 
    ), true) :: Nil) 

val final_schema = (schema1 ++ schema2 ++ schema3).distinct 

println(final_schema) 

출력 :

StructType(
    StructField(A,StructType(
     StructField(i,StringType,true)),true), 
    StructField(A,StructType(
     StructField(i,StringType,true),  
     StructField(ii,StringType,true)),true)) 

내가 정확히 다른 스키마와 일치에만 스키마 구조에 의해 필터링 얻을 것이라는 점을 이해 예를 들어

, 우리는 다음과 같은 구조에서 두 스키마가 있다고 가정 해 distinct. 그러나 결과는 다음과 같아야합니다.

StructType(
    StructField(A,StructType(
     StructField(i,StringType,true),  
     StructField(ii,StringType,true)),true)) 

모든 것이 하나의 스키마에 "결합"됩니다. 나는 scala documentation에있는 모든 방법들을 살펴 보았지만 이것을 해결할 올바른 방법을 찾을 수없는 것 같습니다. 어떤 아이디어?

편집 :

최종 목표는 sqlContext.read.schemafinal_schema에 공급하고 read 방법을 사용하여 JSON 문자열의 RDD을 읽을 수있을 것입니다. 이 같은

답변

0

시도 뭔가 : getKey 당신이 (예를 들어, 열 이름 또는 서브 필드의 이름을) 병합 고려해야 할 속성 스키마에서 이동하는 기능입니다

(schema1 ++ schema2 ++ schema3).groupBy(getKey).map(_._2.head) 

. map 함수에서 특정 스키마를 유지하기 위해 좀 더 정교한 함수를 사용하거나 머리를 쓸 수 있습니다.