2016-04-16 1 views
0

Je suis en train de stocker une structure de données à plat avec environ 120 colonnes en tant que fichier de parquet dans Spark en utilisant Scala. Voici comment j'ai décidé d'y aller, besoin de quelques suggestions ou idées pour le faire mieux, car pour moi, il semble un peu maladroit actuellement.Stockez environ 120 colonnes structure de données plat à Spark Parquet Scala

  1. Créer une ségrégation logique de classe de cas sur la base des données
  2. Créez une classe composite de cas qui inclurait toutes les classes de cas ci-dessus
  3. Utilisez Spark éclatez pour diviser des colonnes composites à des entités individuelles (On dirait que l'étincelle d'exploser fonctionne uniquement sur Seq/Array/List, donc je suis obligé de stocker les éléments de la classe case comme Seq à l'étape 2)
  4. Écrire dans Parquet.

Des idées pour le faire mieux?

+0

Je ne sais pas ce que vous entendez, mais éclatez devrait fonctionner sur quoi que ce soit. Dans l'exemple des docs, ils explosent sur une chaîne en se divisant en un tableau de classes de cas. –

+0

Par exemple. classe de cas Act (a: int, b: chaîne, c: seq [chaîne]), classe de cas Boo (a1: int, b1: chaîne), classe de cas C (a: Act, b: Boo). Alors maintenant, si je veux exploser l'élément C a en trois colonnes (a: int, b: chaîne, c: seq [chaîne]) au lieu d'une seule colonne composite, comment faire? – Anand

+0

Vous ne voulez pas dire exploser. Explode crée de nouvelles lignes. Vous pouvez diviser un coulmn StructType en plusieurs couples avec une instruction select. Vous pouvez juste faire 'select ($" a.a ", $" a.b ", ...)' –

Répondre

1

Vous ne voulez pas dire explode. Explode crée de nouvelles lignes. Vous pouvez diviser une colonne StructType en plusieurs colonnes avec une seule instruction select.

Comme ceci:

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

Yep l'a eu !! Merci !! – Anand

+0

@Anand s'il vous plaît envisager d'accepter cette réponse –