如何在pySpark中将CSV字符串(RDD)转换为DataFrame?

时间:2017-08-24 11:50:09

标签: python apache-spark pyspark

我有一个CSV字符串是RDD,我需要将其转换为spark DataFrame。

我将从头开始解释这个问题。

我有这个目录结构。

 Csv_files (dir)
    |- A.csv
    |- B.csv
    |- C.csv

我只能访问Csv_files.zip,它位于hdfs存储中。

我可以直接读取每个文件是否存储为A.gz,B.gz ......但是我在压缩的目录中有文件。

借助SO(How to open/stream .zip files through Spark?)上的答案,我能够将此zip文件转换为字典。

d = {
    'A.csv':'A,B,C\n1,2,3\n4,5,6 ...'
    'B.csv':'A,B,C\n7,8,9\n1,2,3 ...'
}

现在我应该将此csv_string 'A,B,C\n1,2,3\n4,5,6 ...'转换为数据帧。我试过这个,

如何有效地将csv_string转换为有意义的数据框?

我的Spark版本是1.6.2和python 2.6.6。

1 个答案:

答案 0 :(得分:1)

首先,您必须根据某些符合csv的规则拆分您的dicts。对于此处的示例,我将仅使用带换行符的拆分,但您应该注意值内的换行符(spark 2.2支持多行csv记录)

(scala代码)

// original data as shown in the example
val d: Map[String, RDD[String]] = ...

// flatmap lines
val newRDDs: List[RDD[String]] = d.map(curRDD => {
    // Split csv into multiple lines and drop header
    curRDD._2.flatMap(_.split('\n').drop(1))
})

// Beware, this can be extremely costly if you have too many rdds.
val unionAll: RDD[String] = sc.union(newRDDs)

// Finally, create df from rows.
// In spark 2.2, you would do something like spark.read.csv(spark.createDataset(unionAll))
// In spark < 2.x, you need to parse manually to classes (or Row) and then sqlContext.createDataFrame(parsedRows)

注意:上面的代码尚未编译/测试,仅用于说明这个想法。