我正在通过Dataflow将一些数据导出到csv,但除了数据之外,我想将每个列名添加为输出文件的第一行,例如
col_name1, col_name2, col_name3, col_name4 ...
data1.1, data1.2, data1.3, data1.4 ...
data2.1 ...
无论如何都要使用当前的API吗?(在TextIO.Write
周围搜索但是没有发现任何看似相关的内容......)或者无论如何我可以选择"插入"要导出的PCollection头部的列名称,并强制执行要按顺序写入的数据......?
答案 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"));
新的行字符会自动添加到标题的末尾。