spark之explode()方法--- 行转列

本文介绍如何利用Spark DataFrame的explode方法将List和Map数据转换为多行。通过实例展示了从List及Map类型列中创建新列的过程,并提供了对应的Java代码示例。
摘要由CSDN通过智能技术生成

这篇文章将记录如何使用spark DataFrame将列数据展开,这里使用的是explode方法
将对List数据和Map分别给出展开的例子:


在stackoverflow 中的问题是这样的:
https://stackoverflow.com/questions/37391241/how-to-explode-columns/37392793#37392793

加入我们有这种数据:

nameageinterest
A20篮球,羽毛球
B22游泳,慢跑,写代码
….

我们希望得到这种格式的:

nameageinterest
A20篮球
A20羽毛球
B22游泳
B22慢跑
B22写代码
….

那么使用java如何操作呢? 一种是使用RDD啊什么的一个一个的转,但是强大的spark用提供了一个强大的explode方法
首先看下explode官方给的文档吧~~

è¿éåå¾çæè¿°


可以知道 explode方法可以从规定的Array或者Map中使用每一个元素创建一列

df = df.withColumn("entityPair", functions.explode(functions.col("entityList")));

这里explode中传入的是需要进行展开的列名,withColun中的第一个参数是展开后的新列名。 
其中entityList必须是一个List。例如上面给的数据例子,在爱好哪一行,数据类型应该是这样的

List<String> : {"羽毛球","篮球"}

文档中还说了可以将map数据展开,那么如何进行呢?
假设我们有这样一个map:

urldata
www.xxx.commap(key1->value1, key2->value2)
www.aaa.commap(key3->value3)

我们需要将map中所有的key和value展开,所有的key为一列,所有的value为一列
得到如下结构:

urlkeyvalue
www.xxx.comkey1value1
www.xxx.comkey2value2
www.aaa.comkey3value3

下面给出java 方法:

df = df.select(functions.explode(functions.col("data"))).toDF("key", "value");

可以看到,这里和List有一个不同的地方时需要在explode后接一个toDF操作,是因为map进行展开操作后自然会得到两列,我们需要将其转化为DataFrame格式的两列,列名可以自己指定。
————————————————

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值