我正在使用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