将spark数据帧的每一行写为单独的文件

时间:2018-04-17 16:25:55

标签: apache-spark pyspark file-writing

我的Spark Dataframe有一个列,每行都是一个长字符串(实际上是一个xml文件)。 我想通过DataFrame并将每行中的字符串保存为文本文件,它们可以简单地称为1.xml,2.xml等。

我似乎无法找到有关如何执行此操作的任何信息或示例。 我刚刚开始使用Spark和PySpark。 也许在DataFrame上映射一个函数,但该函数必须将字符串写入文本文件,我无法找到如何执行此操作。

2 个答案:

答案 0 :(得分:1)

我会在Java和Hadoop FileSystem API中这样做。您可以使用Python编写类似的代码。

List<String> strings = Arrays.asList("file1", "file2", "file3");
JavaRDD<String> stringrdd = new JavaSparkContext().parallelize(strings);
stringrdd.collect().foreach(x -> {
    Path outputPath = new Path(x);
    Configuration conf = getConf();
    FileSystem fs = FileSystem.get(conf);
    OutputStream os = fs.create(outputPath);
});

答案 1 :(得分:1)

使用Spark保存数据框时,将为每个分区创建一个文件。因此,每个文件获得一行的一种方法是首先将数据重新分区为与行数一样多的分区。

github上有一个用于使用Spark读取和编写XML文件的库。但是,数据框需要具有特殊格式才能生成正确的XML。在这种情况下,由于您在一列中将所有内容都作为字符串,因此最简单的保存方法可能是csv。

重新分配和保存可以按如下方式进行:

rows = df.count()
df.repartition(rows).write.csv('save-dir')