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

这篇文章将记录如何使用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格式的两列,列名可以自己指定。

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

<think>好的,我需要帮助用户解决如何将他们的代码适配到Spark 3.4.4和Scala SDK 2.11.8的问题。首先,我应该回顾一下用户提到的原始环境,他们之前使用的是spark-2.1.0-bin-hadoop2.6.tgz,现在升级到spark-3.4.4-bin-hadoop3.tgz,同时保持Scala 2.11.8。这可能存在兼容性问题,因为Spark的不同版本对Scala的支持可能不同。 首先,我需要确认Spark 3.4.4是否支持Scala 2.11.8。通常,Spark的每个版本会针对特定的Scala版本进行编译。例如,Spark 2.x通常支持Scala 2.11和2.12,而Spark 3.x可能主要支持Scala 2.12和2.13。根据官方文档,Spark 3.0及以上版本已经放弃了对Scala 2.11的支持,转而主要支持Scala 2.12和2.13。因此,用户可能面临的问题是Spark 3.4.4不再兼容Scala 2.11.8,这可能导致编译错误或运行时异常。 接下来,用户需要确定是否需要继续使用Scala 2.11.8,或者是否可以升级到Scala 2.12。如果必须保留Scala 2.11.8,可能需要寻找旧版本的Spark,但用户明确希望使用Spark 3.4.4,所以这可能不可行。因此,可能的解决方案是升级Scala版本到2.12或更高,同时调整代码以适配Spark 3.4.4。 如果用户确实需要同时使用Spark 3.4.4和Scala 2.11.8,可能需要检查是否存在社区维护的Spark分支,或者是否有兼容的构建版本。但这种情况可能性较低,因此可能需要建议用户升级Scala版本。 此外,用户提到的是修改代码的兼容性问题。Spark 3.x相比2.x有很多API的变化,例如DataFrame和DataSet API的更新,废弃的方法(如SparkSession.sqlContext的某些用法),以及依赖库版本的升级(如Hadoop 3.x)。用户需要检查他们的代码中是否有使用已废弃或移除的API,并替换为新的方法。 例如,在Spark 2中,创建SparkSession可能需要使用SparkContext,而在Spark 3中推荐使用SparkSession.builder。另外,Hadoop从2.6升级到3.x,可能会有配置或依赖的变化,需要确保所有Hadoop相关的依赖项也相应更新。 最后,用户需要调整构建工具(如sbt或Maven)中的依赖项版本,确保Spark和Scala的版本兼容。在sbt中,可能需要修改build.sbt中的libraryDependencies,将Spark版本改为3.4.4,并Scala版本改为2.12.x,如果可行的话。如果用户坚持使用Scala 2.11.8,可能需要寻找是否有Spark 3.4.4的Scala 2.11构建版本,但根据官方信息,这似乎不存在,因此可能需要建议用户升级Scala。 总结下来,主要的步骤包括: 1. 确认Spark 3.4.4与Scala 2.11.8的兼容性。 2. 如果不可兼容,建议升级Scala到支持的版本。 3. 修改代码中因Spark版本升级而废弃或改变的API。 4. 更新构建配置和相关依赖。 5. 测试和验证修改后的代码是否正常运行。 需要将这些步骤以清晰的方式呈现给用户,并提供具体的操作建议和示例,例如如何修改build.sbt,如何替换废弃的API等。此外,可能还需要提醒用户注意Hadoop版本升级带来的变化,比如配置文件或依赖库的调整。</think>### Spark版本与Scala SDK兼容性适配指南 #### 一、版本兼容性分析 1. **Spark 3.x的Scala支持** Spark 3.4.4官方仅支持Scala 2.12和2.13[^1],而Spark 2.1.0支持Scala 2.11。若需继续使用Scala 2.11.8,需降级Spark版本(如Spark 2.4.8)或升级Scala至2.12+。 2. **Hadoop版本适配** `spark-3.4.4-bin-hadoop3`依赖Hadoop 3.x,需确保集群环境与依赖库(如`hadoop-aws`)同步升级。 #### 二、适配方案选择 **方案1:升级Scala至2.12(推荐)** - 修改`build.sbt`配置: ```scala scalaVersion := "2.12.18" libraryDependencies += "org.apache.spark" %% "spark-core" % "3.4.4" ``` - 代码适配: - 替换废弃API,如`SparkSession.sqlContext`改为`SparkSession.sql`。 - 更新序列化库(如`KryoSerializer`配置)。 **方案2:强制使用Scala 2.11(不推荐)** 需手动编译Spark 3.4.4源码并指定Scala 2.11: ```bash ./dev/change-scala-version.sh 2.11 ./build/mvn -Pscala-2.11 clean package ``` 但可能因依赖冲突导致不稳定。 #### 三、代码修改示例 1. **SparkSession初始化** Spark 3.x推荐使用Builder模式: ```scala val spark = SparkSession.builder .appName("Example") .config("spark.serializer", "org.apache.spark.serializer.KryoSerializer") .getOrCreate() ``` 2. **DataFrame API调整** - 替换`df.explode`为`df.withColumn + explode`。 - 使用`Dataset[T]`替代过时的`RDD`操作。 #### 四、依赖管理 更新Hadoop 3.x相关库: ```scala libraryDependencies += "org.apache.hadoop" % "hadoop-aws" % "3.3.6" ``` #### 五、验证步骤 1. 执行`spark-submit --version`确认环境变量。 2. 运行基础任务(如WordCount)验证兼容性。 3. 检查日志中是否有`ClassNotFoundException`或方法弃用警告。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值