【问题标题】:how to get all element from array of arrays of spark dataframe column scala如何从火花数据框列scala的数组中获取所有元素
【发布时间】:2019-08-06 20:46:09
【问题描述】:

我正在使用一个数据框 df 看起来像:

   root
        |-- array(data1, data2, data3, data4): array (nullable = false)
        |    |-- element: array (containsNull = true)
        |    |    |-- element: struct (containsNull = true)
        |    |    |    |-- k: struct (nullable = false)
        |    |    |    |    |-- v: string (nullable = true)
        |    |    |    |    |-- t: string (nullable = false)
        |    |    |    |-- resourcename: string (nullable = true)
        |    |    |    |-- criticity: string (nullable = true)
        |    |    |    |-- v: string (nullable = true)
        |    |    |    |-- vn: double (nullable = true)

如“数据”列中的 df.show() 中所述,类型数组包含四个数组“data1”、“data2”、“data3”、“data4”具有相同的模式和数据类型,我得到这个数据帧后

   df.withcolumn("Column1",array(col("data1"),col("data2")
   ,col("data3"),col("data4"))

我想在同一个数组中获取包含“data1”、“data2”、“data3”和“data4”的所有元素的新数据框。新架构必须是:

      |-- data: array (nullable = true)
      |    |-- element: struct (containsNull = true)
      |    |    |-- criticity: string (nullable = true)
      |    |    |-- k: struct (nullable = true)
      |    |    |    |-- t: string (nullable = true)
      |    |    |    |-- v: string (nullable = true)
      |    |    |-- resourcename: string (nullable = true)
      |    |    |-- v: string (nullable = true)
      |    |    |-- vn: double (nullable = true) 

【问题讨论】:

标签: scala apache-spark dataframe apache-spark-sql


【解决方案1】:

我建议使用数据集。您应该从定义三个案例类开始:

case class MyClass1(t: String, v: String)
case class MyClass2(criticity:String, c1:MyClass1, resourcename:String, v:String, vn: Double)
case class MyList(data:Seq[Seq[MyClass2]])

然后像这样创建您的数据集:

val myDS = df.select(array($"data1",$"data2",$"data3",$"data4").as("data")).as[MyList]
// note than myDS.data has the type: list of lists of MyClass2

// Datasets allow us to make this kind of stuff (flatten data)
val myDSFlatten = myDS.flatMap(_.data)

“myDSFlatten”应该具有所需的架构。

注意我使用的是 Scala。

【讨论】:

    【解决方案2】:

    如果您使用 Spark >= 2.4,则可以使用新功能 flatten 轻松完成此操作。

    flatten(arrayOfArrays) - 将数组数组转换为单个数组 数组。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-16
      • 1970-01-01
      • 2020-06-21
      • 2020-03-11
      • 1970-01-01
      • 2021-10-16
      • 2020-05-23
      • 2021-05-29
      相关资源
      最近更新 更多