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

时间:2015-04-29 13:32:24

标签: scala apache-spark

我使用if (-not $DNSSuffixs -is [Array]) { $DNSSuffixs = $DNSSuffixs -split ',' } 以便将输出保存为文本文件,以便将结果导入到DB中。输出看起来像这样:

saveAsTextFile(path)

如何删除括号?

6 个答案:

答案 0 :(得分:14)

您可以尝试以下非常基本的内容:

rdd.map(x => x._1 + "," + x._2).saveAsTextFile(path)

您只需将您的RDD [(A,B)]映射到RDD [String]并保存。

答案 1 :(得分:6)

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

之前

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

输出没有括号。

答案 2 :(得分:3)

对于Java世界中的人们来说,这是一个以DataFrame开头的解决方案,将其转换为RDD然后写入结果。 RDD的行通过map函数传递,该函数将Row转换为String。

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(",");
    }
}

答案 3 :(得分:1)

尝试明确使用mkString而不是直接打印元组。

答案 4 :(得分:0)

您可以使用保存rdd rdd.map(rec =&gt; rec.productIterator.mkString(“,”)。saveAsTextFile(path) 生成的数据集将没有括号。

答案 5 :(得分:0)

我知道它被标记为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