我有以下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"))
逻辑是所有列值应该作为项目列表,请建议我如何实现这一点。
答案 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)]|
+---------------------------------------------------------------+--------------------------------------------------------------+