[3].Spark 学习笔记 使用java ---explode

来源:互联网 发布:sketch中文版软件 编辑:程序博客网 时间:2024/06/02 01:58

这篇文章将记录如何使用spark DataFrame将列数据展开,这里使用的是explode方法

将对List数据和Map分别给出展开的例子:

在stackoverflow 中的问题是这样的:

https://stackoverflow.com/questions/37391241/how-to-explode-columns/37392793#37392793

加入我们有这种数据:

name age interest A 20 篮球,羽毛球 B 22 游泳,慢跑,写代码 … … ….

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

name age interest A 20 篮球 A 20 羽毛球 B 22 游泳 B 22 慢跑 B 22 写代码 … … ….

那么使用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

url data www.xxx.com map(key1->value1, key2->value2) www.aaa.com map(key3->value3) … …

我们需要将map中所有的key和value展开,所有的key为一列,所有的value为一列

得到如下结构

url key value www.xxx.com key1 value1 www.xxx.com key2 value2 www.aaa.com key3 value3 … … …

下面给出java 方法

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

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

如果您还有好的方法,希望可以留言告诉我~~

原创粉丝点击