Scala如何将我的df数据转换为项目列表

时间:2018-03-15 04:41:47

标签: scala apache-spark

我有以下DF,

+-----+--------------+----------+
|level|var1          |var2      |
+-----+--------------+----------+
|1    |[id, id1]     |[name]    |
|2    |[add1]        |[city1]   |
|3    |[add2]        |[city2]   |
+-----+--------------+----------+

我希望将其存储如下,

val first = List(List("id","id1"), List("add1"), List("add2"))
val second = List(List("name"), List("city1"), List("city2"))

逻辑是所有列值应该作为项目列表,请建议我如何实现这一点。

2 个答案:

答案 0 :(得分:2)

如果您的数据框看起来像下面那样。

df.show()
  //  +-----+---------+-------+
  //  |level|     var1|   var2|
  //  +-----+---------+-------+
  //  |    1|[id, id1]| [name]|
  //  |    2|   [add1]|[city1]|
  //  |    3|   [add2]|[city2]|
  //  +-----+---------+-------+

和数据框架结构。

df.printSchema()
// root
//  |-- level: integer (nullable = true)
//  |-- var1: array (nullable = true)
//  |    |-- element: string (containsNull = true)
//  |-- var2: array (nullable = true)
//  |    |-- element: string (containsNull = true)

您可以像这样收集和转换。

val first: List[List[String]] =
    df.select("var1")
      .collect()
      .map(row =>
        row(0).asInstanceOf[Seq[String]].toList).toList
// List(List(id, id1), List(add1), List(add2))
  val second: List[List[String]] =
    df.select("var2")
      .collect()
      .map(row =>
        row(0).asInstanceOf[Seq[String]].toList).toList
// List(List(name), List(city1), List(city2))

答案 1 :(得分:1)

您可以在每列上使用collect_list 内置函数来收集Array[Array[String]],然后执行类型转换将其更改为{{ 1}}如下

<强> collect_list

List[List[String]]

应该给你

import org.apache.spark.sql.functions._
val tempdf = df.select(collect_list("var1").as("var1"), collect_list("var2").as("var2"))

输入并保存到变量

+---------------------------------------------------------------+--------------------------------------------------------------+
|var1                                                           |var2                                                          |
+---------------------------------------------------------------+--------------------------------------------------------------+
|[WrappedArray(id, id1), WrappedArray(add1), WrappedArray(add2)]|[WrappedArray(name), WrappedArray(city1), WrappedArray(city2)]|
+---------------------------------------------------------------+--------------------------------------------------------------+