我有一个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。
答案 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)
注意:上面的代码尚未编译/测试,仅用于说明这个想法。