2

私はクラウドストレージ、Appengine、BigQueryを使用しているGoogleクラウドプラットフォームでプロトタイプを開発しています。GoogleクラウドプラットフォームのJSONからNDJSONへ

さて、課題の一つは、そのため私はAppEngineの上のcronタスクを使用していたBigQueryするために、Googleのクラウドストレージから毎日ファイルをロードすることです

問題は、BigQueryのデータはNDJSON形式であることを期待しています。(新しい行区切りjson)私のソースファイルは通常のJSON形式です。

現在、私のノートパソコンにファイルをダウンロードし、それをNDJSOnに変換してからbigqueryにアップロードしましたが、どのようにしてgoogle clouldプラットフォームでプログラム的に行うのですか?私は一から書いて欲しくないので、私が使うことのできるものがあることを願っています。

+0

をアップロードする各オブジェクトをクラウドストレージのJava API

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

6>をされています使用して挿入するためにInputStreamを作成しますか?あるいは、各オブジェクトは多くの行に分散していますか? –

+0

ソースファイルは毎日生成され、クラウドストレージバケットに入れられます。各レコードが複数の行にまたがるjson形式です – Shiladitya

+0

バマー - ファイルを変換するために余分な手順を実行する必要があると思います –

答えて

2

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

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

ステップ 1>

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

2 JavaのクラウドストレージAPIを使用してInputStreamとしてJSONファイルを読み込ん> Javaオブジェクトの配列に変換します(私の場合はJSONファイルは複数のレコードを持っています)。単一のレコードであれば、配列は必要ありません。

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

3>配列内のオブジェクトの反復処理とJSON文字列にそれらをひそか>

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クラウドストレージにアップロードするStorageObjectを作成します。 ndjsonの改行を追加します。

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

5>少なくとも別の行にファイル

Storage.Objects.Insert insertRequest = client.objects().insert(
       "shiladitya001", objectMetadata, contentStream); 
     insertRequest.execute();     
関連する問題