如何通过给定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
相关产品推荐
相关产品推荐

