Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google cloud dataflow 使用数据流将数据导出到csv时如何将列名添加为标题_Google Cloud Dataflow - Fatal编程技术网

Google cloud dataflow 使用数据流将数据导出到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的标题处“插入”列名,并强制按顺

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

    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文件,但我只想将头写入一个碎片。。。