我一直在使用google-dataflow-sdk将CSV文件上传到谷歌云存储。 当我将文件上传到Google云项目时,我的数据会以随机顺序显示在云端的文件中。 csv上的每一行都是正确的,但行遍布整个地方。
csv的标题,即。属性,属性,属性)始终在另一条线上,而不是在应该是的顶部。我再次强调,每列中的数据都很好,它只是随机定位的行。
这是最初读取数据的代码:
PCollection<String> csvData = pipeline.apply(TextIO.Read.named("ReadItems")
.from(filename));
这是写入Google云项目的代码:
csvData.apply(TextIO.Write.named("WriteToCloud")
.to("gs://dbm-poc/"+partnerId+"/"+dateOfReport+modifiedFileName)
.withSuffix(".csv"));
感谢您的帮助。
答案 0 :(得分:1)
首先,修复标题使用:
public static TextIO.Write.Bound<String> withHeader(@Nullable String header)
例如:
...
TextIO.Write.withHeader("<header>").apply(..)
...
其次,Dataflow目前不支持对Sinks
的有序/排序写入。这很可能是由于其分布式/并行结构。如果你真的想要,可以编写自己的自定义Sink
。有关详细信息,请参阅类似问题here。
答案 1 :(得分:0)
虽然我同意格雷厄姆波利提供的答案是正确的,但我设法找到一种更简单的方法来以有序的方式写入数据。
我改为使用谷歌云存储库将我需要的文件存储到云端,如下所示:
public static String writeFile(byte[] content, String filename, String partnerId, String dateOfReport) {
Storage storage = StorageOptions.defaultInstance().service();
BlobId blobId = BlobId.of("dbm-poc", partnerId + "/" + dateOfReport + "-" + filename + ".csv");
BlobInfo blobInfo = BlobInfo.builder(blobId).contentType("binary/octet-stream").build();
storage.create(blobInfo, content);
return filename;
}
public static byte[] readFile(String filename) throws IOException {
return Files.readAllBytes(Paths.get(filename));
}
将这两种方法结合使用,我不仅能够将文件上传到我想要的存储桶而不会丢失任何内容订购,但我还能够从文本中更改上传文件的格式到二进制/八位字节流文件,这意味着它可以访问和下载。
此方法似乎也无需使用管道来上传数据。