使用数据流将数据导出到csv

时间:2016-03-25 19:10:03

标签: google-cloud-dataflow

我正在通过Dataflow将一些数据导出到csv,但除了数据之外,我想将每个列名添加为输出文件的第一行,例如

    col_name1, col_name2, col_name3, col_name4 ...
    data1.1, data1.2, data1.3, data1.4 ...
    data2.1 ...

无论如何都要使用当前的API吗?(在TextIO.Write周围搜索但是没有发现任何看似相关的内容......)或者无论如何我可以选择"插入"要导出的PCollection头部的列名称,并强制执行要按顺序写入的数据......?

3 个答案:

答案 0 :(得分:1)

使用@RequestParam没有内置方法可以做到这一点。 TextIO.Write是无序的,所以不可能在前面添加一个元素。您可以编写一个自定义BoundedSink来执行此操作。

答案 1 :(得分:1)

Custom sink APIs现在可用,如果你想成为一个勇敢的人来制作一个CSV接收器。当前的解决方法,将输出构建为单个字符串,并在完成包中输出所有内容:

PCollection<String> output = data.apply(ParDo.of(new DoFn<String, String>() {
private static final long serialVersionUID = 0;

String new_line = System.getProperty("line.separator");
String csv_header = "id, stuff1, stuff2, stuff3" + new_line;
StringBuilder csv_body = new StringBuilder().append(csv_header);

@Override
public void processElement(ProcessContext c) {
    csv_body.append(c.element()).append(newline);
}

@Override
public void finishBundle(Context c) throws Exception {
    c.output(csv_body);
}

})).apply(TextIO.Write.named("WriteData").to(options.getOutput()));

仅当您的BIG输出字符串适合内存

时才会有效

答案 2 :(得分:0)

自Dataflow SDK 1.7.0版起,您在withHeader中拥有TextIO.Write功能。

所以你可以这样做:

TextIO.Write.named("WriteToText")
            .to("/path/to/the/file")
            .withHeader("col_name1,col_name2,col_name3,col_name4")
            .withSuffix(".csv"));

新的行字符会自动添加到标题的末尾。