2016-07-01 1 views
1

у меня есть Спарк RDD, который типа двух классов случае - что-то вроде этого:Как конвертировать РД в течение нескольких классов случае в РДУ их компоненты

RDD[(ACTKey, UIDSKey)] 

где тематические классы определяет следующим образом:

case class ACTKey(ACCOUNT: Int, PERIOD: String, COUNTRY: String) 
case class UIDSKey(PRODUCT: String, UNIT: String, ID: Int) 

Когда я спасаю его в таблице улей, вызвав dataframe.saveAsTable («MyTable», SaveMode.Overwrite) создает двухмерную структуру таблицы:

_1 (struct<ACCOUNT:int,PERIOD:string,COUNTRY:string>) 
_2 (struct<PRODUCT:string,UNIT:string, ID:int>) 

Я хочу иметь простую структуру таблицы вроде этого: СЧЕТ: INT, период: строка, страна: строка, PRODUCT: строка, единица измерения: строка, ID: ИНТ

Один из способов сделать это вручную сопоставьте мой RDD с отдельными компонентами класса case, например map (x => (x._1.ACCOUNT, x._1.PERIOD, ... и т. д.)), но есть слишком много жесткого кодирования, которое должно измениться, если мои классы классов меняются. Поэтому я ищу более элегантное решение, например, чтобы сгладить структуру моего RDD, которая может быть использована для любого RDD, основанного на наборе классов case.

+0

А что если добавить еще один способ, как 'extract' внутри' случае class' что-то вроде 'Защиту извлечь = (this.ACCOUNT, this.PERIOD, this.COUNTRY)' –

+0

Это очень похоже на сопоставление, которое я описал выше, и что-то, чего я пытаюсь избежать - жесткое кодирование атрибутов класса, так как в действительности у меня есть большое количество атрибутов. Также они могут меняться в процессе разработки, а их наличие в нескольких местах может привести к отсутствию некоторых из них. –

ответ

0

Попробуйте это:

rdd.toDF().select("_1.*", "_2.*") 
    .write 
    .format("parquet") 
    .mode(SaveMode.Overwrite) 
    .saveAsTable("MyTable") 
+0

это не работает со следующей ошибкой: Вызвано: parquet.schema.InvalidSchemaException: не удается написать схему с пустая группа: корень сообщения { } –

+0

@MichaelD Вы решили проблему «пустой группы»? – Aguinore

Смежные вопросы