上下文
我有一个包含(我认为是) (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)Col2过去包含一个Map[String, String],我在其上做了一个toList(),然后进行了explode(),以获得原始地图中的每个映射一行。
问题
我想将Col2分成2列,并获得以下数据:
| Col1 | key | value |
| A | k1 | v1 |
| A | k2 | v2 |,有人知道怎么做吗?
或者,有人知道如何将映射转换为多个行(每个映射一个)和两个列(一个表示键,一个表示值)。
我尝试过的事情/错误
我尝试在(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==> --我猜Col2的类型是org.apache.spark.sql.catalyst.expressions.GenericRowWithSchema,找不到火花/ scala。
即使这样做有效,也会出现这样的问题:使用索引不是访问元组元素的正确方法.
谢谢!
发布于 2018-03-23 00:43:51
您可以使用select来投影struct的每个元素来解压它。
df.select($"Col1", $"Col2._1".as("key"), $"Col2._2".as("value"))发布于 2018-06-06 02:56:32
您只需添加另一种方法即可:
df.withColumn("key", $"Col2._1")
.withColumn("value", $"Col2._2")https://stackoverflow.com/questions/49440618
复制相似问题