2016-12-27 5 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, но я не могу найти правильный метод для решения этой проблемы. Есть идеи?

EDIT:

Конечной целью будет кормить в final_schema к sqlContext.read.schema и читать RDD из JSON строки, используя метод read.

ответ

0

попробовать что-то вроде этого:

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

где getKey это функция, которая идет от схемы к свойствам, которые вы хотите рассмотреть для объединения (например, имя столбца или имя суб полей). В функции map вы можете взять голову или использовать более сложную функцию, чтобы сохранить определенную схему.