将大约 120 个基于列的平面数据结构存储到 Spark Parquet Scala
Store about 120 Column based flat data structure to Spark Parquet Scala
我正在尝试使用 Scala 在 Spark 中将具有大约 120 列的平面数据结构存储为 Parquet 文件。
这是我决定如何去做的,需要一些建议或想法来做得更好,目前对我来说它看起来有点笨拙。
- 根据数据
创建案例class的逻辑隔离
- 创建一个复合案例 class 将包括上述所有案例 classes
- 使用 Spark explode 将复合列拆分为单个实体(看起来 spark explode 仅适用于 Seq/Array/List,因此我不得不在步骤 2 中将 case class 元素存储为 Seq)
- 写入 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|
+--------------------+---+------+-----------+---+-------+
我正在尝试使用 Scala 在 Spark 中将具有大约 120 列的平面数据结构存储为 Parquet 文件。 这是我决定如何去做的,需要一些建议或想法来做得更好,目前对我来说它看起来有点笨拙。
- 根据数据 创建案例class的逻辑隔离
- 创建一个复合案例 class 将包括上述所有案例 classes
- 使用 Spark explode 将复合列拆分为单个实体(看起来 spark explode 仅适用于 Seq/Array/List,因此我不得不在步骤 2 中将 case class 元素存储为 Seq)
- 写入 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|
+--------------------+---+------+-----------+---+-------+