【问题标题】:How to parse a csv string into a Spark dataframe using scala?如何使用 scala 将 csv 字符串解析为 Spark 数据帧?
【发布时间】:2018-10-12 01:34:03
【问题描述】:

我想将包含字符串记录的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 。 然而,这并不完全是我所需要的,我想不出一种方法来修改这段代码以在我的情况下工作。

非常感谢您的帮助。

【问题讨论】:

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


    【解决方案1】:

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


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

    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|
    +----+-----------+-----+---+
    

    【讨论】:

    • 非常感谢,这正是我所需要的!!
    • 当只有几行可以直观检查时,这可能没问题,但通常不建议使用简单的换行符和逗号拆分来解析 CSV,因为您可以将这些字符放在单元格中价值。 CSV 是“解析”的,这与简单的文本操作甚至正则表达式模式匹配都有根本的不同,最好使用真正的 CSV 库。
    猜你喜欢
    • 2021-11-09
    • 1970-01-01
    • 2019-05-10
    • 1970-01-01
    • 2019-12-28
    • 2018-03-20
    • 2022-07-25
    • 1970-01-01
    • 2010-12-18
    相关资源
    最近更新 更多