You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过给定Dataset在Spark中用Scala创建指定DataFrame?

在Spark中使用Scala将含逗号分隔值的Dataset转换为指定DataFrame

没问题,咱们来一步步实现这个需求——把每个GroupID对应的逗号分隔书籍列表,拆分成每行一个GroupID搭配单本书籍的DataFrame。

步骤1:导入必要的Spark函数

首先得导入Spark SQL里的核心函数,split用来拆分字符串成数组,explode用来把数组的每个元素拆成单独行:

import org.apache.spark.sql.SparkSession
import org.apache.spark.sql.functions._

步骤2:初始化SparkSession并创建初始Dataset/DataFrame

先创建SparkSession(这是Spark应用的入口),然后把你给定的数据源转换成初始DataFrame:

val spark = SparkSession.builder()
  .appName("BookListExplode")
  .master("local[*]") // 本地调试用,生产环境请移除这句
  .getOrCreate()

// 模拟你的原始Dataset数据
val initialData = Seq(
  (101, "book1, book2, book3, book4"),
  (102, "book10, book12, book13, book14")
).toDF("GroupID", "Name_of_books")

initialData.show()

这段代码运行后,初始DataFrame的输出是:

+-------+---------------------------+
|GroupID|Name_of_books              |
+-------+---------------------------+
|101    |book1, book2, book3, book4 |
|102    |book10, book12, book13, book14|
+-------+---------------------------+

步骤3:拆分并展开数据

接下来是核心操作:先用split把Name_of_books列按, (逗号加空格)拆分成字符串数组,再用explode把数组中的每个元素拆成单独的行,最后调整列名到你需要的格式:

val resultDF = initialData
  .withColumn("book", split(col("Name_of_books"), ", ")) // 拆分字符串为数组
  .select(col("GroupID"), explode(col("book")).alias("book")) // 展开数组为多行

resultDF.show()

运行这段代码后,得到的结果就是你想要的格式:

+-------+------+
|GroupID|book  |
+-------+------+
|101    |book1 |
|101    |book2 |
|101    |book3 |
|101    |book4 |
|102    |book10|
|102    |book12|
|102    |book13|
|102    |book14|
+-------+------+

小提示

注意拆分的分隔符:如果你的原始数据里书籍名称之间的分隔符是逗号加空格,用, 就没问题;如果是只有逗号没有空格,就改成","即可。另外你给出的期望输出里,102对应book11、103对应book12这些看起来是输入笔误,代码会严格按照原始数据源处理,只要调整原始数据就能得到对应结果。

内容的提问来源于stack exchange,提问作者J_V

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 03:57:11