Rap*_*nns 2 apache-spark spark-dataframe
我有一个包含数据帧(我认为是)的夫妇(String, String)。
它看起来像这样:
> df.show
| Col1 | Col2 |
| A | [k1, v1]|
| A | [k2, v2]|
> df.printSchema
|-- _1: string (nullable = true)
|-- _2: struct (nullable = true)
| |-- _1: string (nullable = true)
| |-- _2: string (nullable = true)
Run Code Online (Sandbox Code Playgroud)
Col2用于包含Map[String, String]我已经完成的 atoList()然后explode()为原始地图中存在的每个映射获取一行。
我想Col2分成 2 列并获取此数据框:
| Col1 | key | value |
| A | k1 | v1 |
| A | k2 | v2 |
Run Code Online (Sandbox Code Playgroud)
有谁知道如何做到这一点?
或者,有谁知道如何将地图分解+拆分为多行(每个映射一列)和两列(一列用于键,一列用于值)。
我尝试使用通常成功的模式,(String, String)但这不起作用:
df.select("Col1", "Col2").
map(r =>(r(0).asInstanceOf[String],
r(1).asInstanceOf[(String, String)](0),
r(1).asInstanceOf[(String, String)](1)
)
)
Caused by: java.lang.ClassCastException:
org.apache.spark.sql.catalyst.expressions.GenericRowWithSchema cannot be cast to scala.Tuple2
Run Code Online (Sandbox Code Playgroud)
==> 我猜 Col2 的类型是org.apache.spark.sql.catalyst.expressions.GenericRowWithSchema,无法为此找到 spark/scala 文档。
即使这样做有效,也会存在使用索引不是访问元组元素的正确方法的问题......
谢谢!
您可以使用 select 来投影 struct 的每个元素以将其解包。
df.select($"Col1", $"Col2._1".as("key"), $"Col2._2".as("value"))
Run Code Online (Sandbox Code Playgroud)
小智 5
您可以添加另一个方法来做到这一点:
df.withColumn("key", $"Col2._1")
.withColumn("value", $"Col2._2")
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6039 次 |
| 最近记录: |