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

Apache spark 将spark数据帧的每一行作为单独的文件写入,apache-spark,pyspark,file-writing,Apache Spark,Pyspark,File Writing,我的Spark Dataframe只有一列,其中每一行都是一个长字符串(实际上是一个xml文件)。 我想遍历DataFrame并将每行中的一个字符串保存为文本文件,它们可以简单地称为1.xml、2.xml等等 我似乎找不到任何关于如何做到这一点的信息或例子。 我刚刚开始与Spark和PySpark合作。 可能在DataFrame上映射一个函数,但该函数必须将字符串写入文本文件,我找不到如何做到这一点。我会在Java和Hadoop文件系统API中这样做。您可以使用Python编写类似的代码 Lis

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

我似乎找不到任何关于如何做到这一点的信息或例子。 我刚刚开始与Spark和PySpark合作。
可能在DataFrame上映射一个函数,但该函数必须将字符串写入文本文件,我找不到如何做到这一点。

我会在Java和Hadoop文件系统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);
});
List strings=Arrays.asList(“file1”、“file2”、“file3”);
JavaRDD stringrdd=新的JavaSparkContext().parallelize(字符串);
stringrdd.collect().foreach(x->{
路径输出路径=新路径(x);
配置conf=getConf();
FileSystem fs=FileSystem.get(conf);
OutputStream os=fs.create(outputPath);
});

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

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

可以按如下方式重新分区和保存:

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

我不懂java,所以我将使用下一个解决方案。无论如何,谢谢。getConf()来自哪里?在这个解决方案可以工作之前,您必须先连接数据帧吗?count方法是否需要先将所有数据作为数据帧读入内存,然后重新分区并写入?如果输入大小太大怎么办?Will count方法强制所有数据必须首先读取。