Google cloud dataflow 使用数据流将数据导出到csv时如何将列名添加为标题
我正在通过数据流将一些数据导出到csv,但除了数据之外,我还希望将每个列名添加为输出文件的第一行,例如Google cloud dataflow 使用数据流将数据导出到csv时如何将列名添加为标题,google-cloud-dataflow,Google Cloud Dataflow,我正在通过数据流将一些数据导出到csv,但除了数据之外,我还希望将每个列名添加为输出文件的第一行,例如 col_name1, col_name2, col_name3, col_name4 ... data1.1, data1.2, data1.3, data1.4 ... data2.1 ... 是否与当前API有任何关系?(搜索了TextIO.Write但没有找到任何相关的内容…)或者是否有任何方法可以在要导出的PCollection的标题处“插入”列名,并强制按顺
col_name1, col_name2, col_name3, col_name4 ...
data1.1, data1.2, data1.3, data1.4 ...
data2.1 ...
是否与当前API有任何关系?(搜索了
TextIO.Write
但没有找到任何相关的内容…)或者是否有任何方法可以在要导出的PCollection的标题处“插入”列名,并强制按顺序写入数据 使用TextIO.Write
没有内置的方法来实现这一点<代码>P集合无序,因此无法在前面添加元素。您可以编写一个自定义程序来实现这一点。如果您想勇敢地制作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()));
PCollection output=data.apply(ParDo.of(new DoFn)(){
私有静态最终长serialVersionUID=0;
字符串new_line=System.getProperty(“line.separator”);
字符串csv_header=“id,stuff1,stuff2,stuff3”+新行;
StringBuilder csv\u body=新建StringBuilder().append(csv\u头);
@凌驾
公共void processElement(ProcessContext c){
csv_body.append(c.element()).append(换行符);
}
@凌驾
公共void finishBundle(上下文c)引发异常{
c、 输出(csv_体);
}
})).apply(TextIO.Write.named(“WriteData”).to(options.getOutput());
只有当您的大输出字符串适合内存时,这才有效从Dataflow SDK 1.7.0版开始,您在中有函数 所以你可以这样做:
TextIO.Write.named("WriteToText")
.to("/path/to/the/file")
.withHeader("col_name1,col_name2,col_name3,col_name4")
.withSuffix(".csv"));
一个新行字符会自动添加到标题的末尾。谢谢你,本,啊,我有一个后续问题。。。是否有任何方法可以为不同的碎片定义不同的行为,比如我有最终输出写入n个碎片csv文件,但我只想将头写入一个碎片。。。