2

我正在谷歌云平台上开发一个原型,我正在使用云存储、appengine 和 bigquery。

现在,其中一项任务是每天从谷歌云存储加载一个文件到我在 Appengine 上使用 Cron 任务的 bigquery

问题是 bigquery 期望数据采用 NDJSON 格式。(新行分隔的 json),而我的源文件是普通的 JSON 格式。

目前,我将文件下载到我的笔记本电脑并将其转换为 NDJSOn,然后上传到 bigquery,但我如何在谷歌云平台上以编程方式执行它?我希望有一些可用的东西我可以使用,因为我不想从头开始写。

4

1 回答 1

3

可能对其他人有用。我就是这样做的,但如果有更好或更简单的方法,请告诉我。需要下载云存储java API和依赖(http客户端api和oauth api): https ://developers.google.com/api-client-library/java/apis/

需要下载像杰克逊这样的JSON解析器。

步骤

1> 使用java云存储API读取json文件作为inputstream

Storage.Objects.Get getObject = client.objects().get("shiladityabucket", "abc.json");
InputStream input = getObject.executeMediaAsInputStream();

2>转换成Java对象数组(我的json文件有多个记录)。如果是单条记录,则不需要数组。

ObjectMapper mapper = new ObjectMapper();
BillingInfo[] infoArr = mapper.readValue(input, BillingInfo[].class);

3> 创建一个 StorageObject 上传到云存储

StorageObject objectMetadata = new StorageObject()
            // Set the destination object name
            .setName("abc.json")
            // Set the access control list to publicly read-only
            .setAcl(Arrays.asList(
                    new ObjectAccessControl().setEntity("allUsers").setRole("READER")));    

4> 遍历数组中的对象并将它们转换为 json 字符串。为 ndjson 添加换行符。

for (BillingInfo info:infoArr) {            
    jSonString += mapper.writeValueAsString(info);
    jSonString += "\n";                 
}   

5> 使用云存储 java api 创建要插入的 Inputstream

InputStream is = new ByteArrayInputStream(jSonString.getBytes());
InputStreamContent contentStream = new InputStreamContent(null, is);

6> 上传文件

Storage.Objects.Insert insertRequest = client.objects().insert(
                "shiladitya001", objectMetadata, contentStream);
insertRequest.execute();                
于 2016-08-11T13:59:58.867 回答