上传到谷歌云存储时,输出数据以随机顺序显示

时间:2017-01-18 11:09:04

标签: java google-cloud-storage google-cloud-platform google-cloud-dataflow

我一直在使用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"));

感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

首先,修复标题使用:

public static TextIO.Write.Bound<String> withHeader(@Nullable String header)

https://cloud.google.com/dataflow/java-sdk/JavaDoc/com/google/cloud/dataflow/sdk/io/TextIO.Write#withHeader-java.lang.String-

例如:

...
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));
}

将这两种方法结合使用,我不仅能够将文件上传到我想要的存储桶而不会丢失任何内容订购,但我还能够从文本中更改上传文件的格式到二进制/八位字节流文件,这意味着它可以访问和下载。

此方法似乎也无需使用管道来上传数据。