Java 上传到谷歌云存储时,输出数据以随机顺序出现
我一直在使用谷歌数据流sdk将CSV文件上传到谷歌云存储。 当我将文件上传到谷歌云项目时,我的数据以随机顺序出现在一个文件中。csv上的每一行都是正确的,但各行都是正确的 csv的标题(即属性、属性、属性)始终位于另一行上,且从不位于应位于的顶部。我再次强调,每列中的数据都很好,只是随机定位的行 以下是最初读取数据的代码: PCollection csvData=pipeline.applyTextIO.Read.nameItems .fromfilename; 这是写入谷歌云项目的代码: csvData.applyTextIO.Write.namedWriteToCloud .togs://dbm-poc/+partnerId+/+dateOfReport+modifiedFileName .withSuffix.csv;Java 上传到谷歌云存储时,输出数据以随机顺序出现,java,google-cloud-storage,google-cloud-platform,google-cloud-dataflow,Java,Google Cloud Storage,Google Cloud Platform,Google Cloud Dataflow,我一直在使用谷歌数据流sdk将CSV文件上传到谷歌云存储。 当我将文件上传到谷歌云项目时,我的数据以随机顺序出现在一个文件中。csv上的每一行都是正确的,但各行都是正确的 csv的标题(即属性、属性、属性)始终位于另一行上,且从不位于应位于的顶部。我再次强调,每列中的数据都很好,只是随机定位的行 以下是最初读取数据的代码: PCollection csvData=pipeline.applyTextIO.Read.nameItems .fromfilename; 这是写入谷歌云项目的代码: cs
感谢您的帮助。首先,要修复标题,请使用:
public static TextIO.Write.Bound<String> withHeader(@Nullable String header)
例如:
...
TextIO.Write.withHeader("<header>").apply(..)
...
其次,数据流目前不支持对接收器的有序/排序写入。这很可能是由于其分布式/并行体系结构。如果你真的想写的话,你可以写你自己的定制水槽。有关更多详细信息,请参见类似问题。虽然我同意格雷厄姆·波利提供的答案是正确的,但我还是设法找到了一种更简单的方法,让数据按顺序写入 相反,我使用google云存储库将我需要的文件存储到云上,如下所示: 公共静态字符串writeFilebyte[]内容、字符串文件名、字符串partnerId、字符串dateOfReport{ Storage Storage=StorageOptions.defaultInstance.service; BlobId BlobId=BlobId.ofdbm-poc,partnerId+/+dateOfReport+-+filename+.csv; BlobInfo BlobInfo=BlobInfo.builderbloid.contentTypebinary/octet-stream.build; storage.createblobInfo,内容; 返回文件名; } 公共静态字节[]readFileString文件名引发IOException{ return Files.readAllBytesPath.getfilename; } 通过将这两种方法结合使用,我不仅能够将文件上传到我想要的bucket,而不会丢失任何内容顺序,而且还能够将上传文件的格式从文本更改为二进制/八位字节流文件,这意味着可以访问和下载
这种方法似乎也消除了使用管道上传数据的需要。是的,我决定不使用它。我不确定是否有更简单的选择