2016-04-16 1 views
0

Я пытаюсь сохранить плоскую структуру данных с примерно 120 столбцами в виде файла Parquet в Spark с использованием Scala. Вот как я решил заняться этим, нужно немного предложений или идей, чтобы сделать это лучше, так как для меня это выглядит немного неуклюжим в настоящее время.Магазин около 120 Структура данных на основе столбцов на Spark Parquet Scala

  1. Создание логического разделения корпуса класса на основе данных
  2. Создать один композитный класс случай, который будет включать в себя все перечисленные выше классы тематических
  3. Используйте свечи взрываются, чтобы разделить составные столбцы к отдельным подразделениям (Похоже, искры взорваться работает только на Seq/Array/List, поэтому я вынужден хранить элементы класса case как Seq на шаге 2)
  4. Пишите паркету.

Идеи сделать это лучше?

+0

Не уверен, что вы имеете в виду, но взрываются должны работать на что-нибудь. В примере в документах они взрываются в строке, разбиваясь на массив классов case. –

+0

. case class Act (a: int, b: string, c: seq [string]), case class Boo (a1: int, b1: String), класс case C (a: Act, b: Boo). Итак, теперь, если я хочу взорвать элемент C a на три столбца (a: int, b: string, c: seq [string]) вместо одного составного столбца Act, как это сделать? – Anand

+0

Вы не хотите взорваться. Explode создает новые строки. Вы можете разделить кусок StructType на несколько пар с помощью оператора select. Вы можете просто сделать 'select ($" a.a ", $" a.b ", ...)' –

ответ

1

Вы не имеете в виду explode. Explode создает новые строки. Вы можете разделить столбец StructType на несколько столбцов с одним оператором select.

Как это:

case class Act(a: Int, b: Seq[String]) 
case class Boo(a1: Int, b1: String) 
case class C(a: Act, b: Boo) 

val df = Seq(C(Act(1, Seq("test")), Boo(2, "this is"))).toDF 

df.show 
+--------------------+-----------+ 
|     a|   b| 
+--------------------+-----------+ 
|[1,WrappedArray(t...|[2,this is]| 
+--------------------+-----------+ 

df.printSchema 
root 
|-- a: struct (nullable = true) 
| |-- a: integer (nullable = false) 
| |-- b: array (nullable = true) 
| | |-- element: string (containsNull = true) 
|-- b: struct (nullable = true) 
| |-- a1: integer (nullable = false) 
| |-- b1: string (nullable = true) 


df.select($"a", $"a.a", $"a.b", $"b", $"b.a1", $"b.b1").show 
+--------------------+---+------+-----------+---+-------+ 
|     a| a|  b|   b| a1|  b1| 
+--------------------+---+------+-----------+---+-------+ 
|[1,WrappedArray(t...| 1|[test]|[2,this is]| 2|this is| 
+--------------------+---+------+-----------+---+-------+ 
+0

Да, это получилось! благодаря !! – Anand

+0

@ Обязательно подумайте о принятии этого ответа –