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

Store about 120 Column based flat data structure to Spark Parquet Scala

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

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

有更好的想法吗?

你不是说 explode。爆炸创建新行。您可以使用单个 select 语句将 StructType 列拆分为多个列。

像这样:

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|
+--------------------+---+------+-----------+---+-------+