将大约120个基于柱的平面数据结构存储到Spark Parquet Scala

时间:2016-04-16 16:32:00

标签: scala apache-spark parquet

我正在尝试使用Scala将大约120列的平面数据结构存储为Spark中的Parquet文件。 这就是我决定如何去做,需要一些建议或想法来做得更好,对我而言,目前看起来有些笨拙。

  1. 根据数据
  2. 创建案例类的逻辑隔离
  3. 创建一个包含所有上述案例类的复合案例类
  4. 使用Spark explode将复合列拆分为单个实体(看起来spark sparkde仅适用于Seq / Array / List,因此我不得不在步骤2中将case类元素存储为Seq)
  5. 写信给Parquet。
  6. 想要做得更好吗?

1 个答案:

答案 0 :(得分:1)

你不是指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|
+--------------------+---+------+-----------+---+-------+