如何使用scala将csv字符串解析为Spark数据帧?

时间:2018-05-02 02:04:48

标签: scala csv apache-spark apache-spark-sql rdd

我想将包含字符串记录的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版。

我做了搜索并看了一篇帖子: Can I read a CSV represented as a string into Apache Spark using spark-csv 。 然而,它并不完全是我需要的,我无法找到一种方法来修改这段代码以适应我的情况。

非常感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

更简单的方法可能是从CSV文件开始并直接将其作为数据框读取(通过指定模式)。您可以在此处查看示例:Provide schema while reading csv file as a dataframe

当数据已存在于RDD中时,您可以使用toDF()转换为数据帧。此函数还接受列名作为输入。要使用此功能,请首先使用SparkSession对象导入spark implicits:

val spark: SparkSession = SparkSession.builder.getOrCreate()
import spark.implicits._

由于RDD包含字符串,因此需要首先将其转换为表示数据帧中列的元组。在这种情况下,这将是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|
+----+-----------+-----+---+