如何在RDD[(String, Int)]上保存AsTextFile时删除记录周围的括号



我正在使用saveAsTextFile(path)以便稍后将输出另存为文本文件以将结果导入数据库。输出如下所示:

(value1, value2)

如何删除括号?

您可以尝试以下非常基本的操作:

rdd.map(x => x._1 + "," + x._2).saveAsTextFile(path)
您只需将 RDD[

(A,B)] 映射到 RDD[String] 并保存即可。

在制作saveAsTextFile之前

,请使用map(x => x.mkString(",")

rdd.map(x => x.mkString(",").saveAsTextFile(path)

输出将没有括号。

对于Java世界中的人们,这里有一个解决方案,它从DataFrame开始,将其转换为RDD,然后写入结果。 RDD 的行通过将行转换为字符串的映射函数传递。

public void write(DataFrame output) {
    String path = "your_path_goes_here";
    output
        .toJavaRDD()
        .map(new BracketRemover())
        .saveAsTextFile(path);
}
protected class BracketRemover implements Function<Row, String> {
    public String call(Row r) {
        return r.mkString(",");
    }
}

尝试显式使用 mkString,而不仅仅是直接打印元组。

您可以使用以下命令保存 rddrdd.map(rec => rec.productIterator.mkString(","). saveAsTextFile(path)生成的数据集将没有括号。

我知道

它被标记为Scala,但只是为了补充Python,以防有人好奇。创建 RDD 并按原样保存

rdd_of_tuples = sc.parallelize([('one',1),('two',2)])
rdd_of_tuples.saveAsTextFile('/user/cloudera/rdd_of_tuples')

这将保存您提到的这样的行

('one', 1)

但是,如果您执行以下操作,它应该可以工作

rdd_of_text = rdd_of_tuples.map(lambda (x,y): x + ',' + str(y)).saveAsTextFile('/user/cloudera/rdd_of_text')

你应该得到

one,1

请注意,在这种特殊情况下,您需要了解连接的类型(检查 str(y)),否则将出现以下异常

TypeError: cannot concatenate 'str' and 'int' objects

最新更新