首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >星火数据-将结构列拆分为2列

星火数据-将结构列拆分为2列
EN

Stack Overflow用户
提问于 2018-03-23 00:35:14
回答 2查看 8.6K关注 0票数 4

上下文

我有一个包含(我认为是) (String, String)夫妇的数据框架。

看起来是这样的:

代码语言:javascript
复制
> 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列,并获得以下数据:

代码语言:javascript
复制
| Col1 | key    | value |
| A    | k1     | v1    |
| A    | k2     | v2    |

,有人知道怎么做吗?

或者,有人知道如何将映射转换为多个行(每个映射一个)和两个列(一个表示键,一个表示值)。

我尝试过的事情/错误

我尝试在(String, String)中使用通常成功的模式,但这不起作用:

代码语言:javascript
复制
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。

即使这样做有效,也会出现这样的问题:使用索引不是访问元组元素的正确方法.

谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-03-23 00:43:51

您可以使用select来投影struct的每个元素来解压它。

代码语言:javascript
复制
df.select($"Col1", $"Col2._1".as("key"), $"Col2._2".as("value"))
票数 9
EN

Stack Overflow用户

发布于 2018-06-06 02:56:32

您只需添加另一种方法即可:

代码语言:javascript
复制
df.withColumn("key", $"Col2._1")
  .withColumn("value", $"Col2._2")
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49440618

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档