2

クラウド ストレージ、appengine、bigquery を使用している Google クラウド プラットフォームでプロトタイプを開発しています。

現在、タスクの 1 つは、Google クラウド ストレージから Appengine で Cron タスクを使用している bigquery にファイルを毎日ロードすることです。

問題は、bigquery がデータが NDJSON 形式 (改行で区切られた json) であることを期待しているのに対し、ソース ファイルは通常の JSON 形式であることです。

現在、ファイルをラップトップにダウンロードして NDJSOn に変換し、次に bigquery にアップロードしましたが、Google クラウド プラットフォームでプログラムで行うにはどうすればよいですか? ゼロから書きたくないので、使用できるものがあることを願っています。

4

1 に答える 1

3

他の人に役立つかもしれません。私はこのようにしましたが、もっと良い方法や簡単な方法があれば教えてください。Cloud Storage Java API と依存関係 (http クライアント API と oauth API) をダウンロードする必要があります: https://developers.google.com/api-client-library/java/apis/

jackson のような JSON パーサーをダウンロードする必要があります。

手順:

1> Java クラウド ストレージ API を使用して、json ファイルを入力ストリームとして読み取ります

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 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 に答える