scala - 如何使用 scala 将 csv 字符串解析为 Spark 数据帧?
问题描述
我想将RDD
包含字符串的记录(如下所示)转换为 Spark 数据帧。
"Mike,2222-003330,NY,34"
"Kate,3333-544444,LA,32"
"Abby,4444-234324,MA,56"
....
模式行不在同一内部RDD
,而是在另一个变量中:
val header = "name,account,state,age"
所以现在我的问题是,如何使用上述两个在 Spark 中创建数据框?我正在使用 Spark 2.2 版。
我进行了搜索并看到了一个帖子: 我可以使用 spark-csv 将表示为字符串的 CSV 读入 Apache Spark 。然而,这并不完全是我所需要的,我想不出一种方法来修改这段代码以在我的情况下工作。
非常感谢您的帮助。
解决方案
更简单的方法可能是从 CSV 文件开始并将其作为数据框直接读取(通过指定架构)。您可以在此处查看示例:Provide schema while reading csv file as a dataframe。
当数据已经存在于 RDD 中时,您可以使用它toDF()
来转换为数据帧。此函数还接受列名作为输入。要使用此功能,首先使用SparkSession
对象导入 spark 隐式:
val spark: SparkSession = SparkSession.builder.getOrCreate()
import spark.implicits._
由于 RDD 包含字符串,因此需要首先将其转换为表示数据帧中列的元组。在这种情况下,这将是 a,RDD[(String, String, String, Int)]
因为有四列(最后一age
列更改为 int 以说明如何完成)。
假设输入数据在rdd
:
val header = "name,account,state,age"
val df = rdd.map(row => row.split(","))
.map{ case Array(name, account, state, age) => (name, account, state, age.toInt)}
.toDF(header.split(","):_*)
结果数据框:
+----+-----------+-----+---+
|name| account|state|age|
+----+-----------+-----+---+
|Mike|2222-003330| NY| 34|
|Kate|3333-544444| LA| 32|
|Abby|4444-234324| MA| 56|
+----+-----------+-----+---+
推荐阅读
- sql - INNER JOIN 和计数 POSTGRESQL
- javascript - 闪亮的反应性 JS 元素
- design-patterns - 在 Rust 中传递类型的惯用方式是什么?
- typescript - Adonisjs 上次更新(v5)模型创建命令不起作用
- python - 在 Python 中拆分 test-val 数据的“种子”是什么以及如何得出正确的数字?
- spring - 基于多态类结构的 Spring Cloud Stream 消息
- r - GGplot 绘制每个点两次
- dataframe - 如何添加多个数据框加入如何
- python - 如何从巨大的 txt 文件中删除/删除与文本匹配的特定行
- xml - 在火花中读取多个xml文件时获取文件名