2017-03-27 3 views
1

Google Apps Scriptを使用して、BigQuery APIを使用してBigQueryテーブルにデータを追加しようとしています。追加するデータは現在CSV形式です。これまでのところ、stream data into BigQueryを使用してtabledata().insertAll()を使用することができますが、jsonフォーマットが必要なように見えます。私はそれが必要なことをするとは確信していません。これに私が欠けている簡単な解決策はありますか?私はBigQueryが追加をサポートしていることを知っていますが、私が見つけていることは、本当に新しいテーブルにデータを読み込むことに焦点を当てています。APIを使用してCSVファイルから既存のBigQueryテーブルにデータを追加できますか?

EDIT: tabledata().insertAll()が実際に(うまくいけば)を使用する権利の方法であるような音。だから、代わりに私のファイルをjsonに変換しましたが、今は実際にどのように使用するかについては固執しています。私はreference page for itの中で何をしているのかを見極めようとしていますが、それはまだ私にとっては本当に混乱しています。現在、コードを実行したときにfetchコールが発生すると、404エラーが発生します。私はURLフェッチをしようとしている、多分それは私が物事をやっているとは思わない?私はAPIには本当に新しいので、私はまだ彼らがどのように動作するかを考えています。ここでは、これを引き起こしている私は現在、それを持っているコードです:

var tableId = 'users'; 
var file = DriveApp.getFileById(jsonId); 
//I don't know if a blob is the type that I want or not, but I'm trying it 
var data = file.getBlob(); 

var url = 'https://www.googleapis.com/bigquery/v2/projects/PROJECT_ID/datasets/DATASET_ID/tables/tableId/insertAll' 
.replace("PROJECT_ID", params.PROJECT_ID) 
.replace("DATASET_ID", params.DATASET_ID) 
.replace("tableId", tableId); 

var response = UrlFetchApp.fetch(url, { 
"kind": "bigquery#tableDataInsertAllRequest", 
"skipInvalidRows": 0, 
"ignoreUnknownValues": 0, 
"rows": [ 
    { 
    "json": data 
    } 
], 
headers: { 
    Authorization: 'Bearer ' + service.getAccessToken() 
} 
}); 


var result = JSON.parse(response.getContentText()); 
Logger.log(JSON.stringify(result, null, 2)); 
+0

を呼び出すことができますので、文字列の2次元配列を返すステップあなたに問題がありますか?何を試してみましたか –

+0

'insertAll()'メソッドは確かに私が欲しいものですか?私の問題は、CSVファイルをjson(理想的にはGoogle Apps Scriptで)に変換するための適切な方法を見つけることです。さらに実際に関数呼び出しがどのように機能するかを実際に把握します。私はこれが私が探していた正しい方法さえも疑っていました。 –

+0

OK私は今json形式で自分のデータを持っていると思います(うまくいけば正しく)。ここから私は実際にAPIを呼び出すのに苦労しています。私は今質問をもっと詳細で更新することができます。 –

答えて

1

これはBQ JSONへのcsvファイルから最も直接的ではないが、それは私がBigQueryの側であなたを助ける必要があることを使用しているいくつかのコードです。

var PROJECT_ID = "xxx"; 
var DATASET_ID = "yyy"; 
function convertValuesToRows(data) { 
    var rows = []; 
    var headers = data[0]; 

    for (var i = 1, numColumns = data.length; i < numColumns; i++) { 
    var row = BigQuery.newTableDataInsertAllRequestRows(); 
    row.json = data[i].reduce(function(obj, value, index) { 
     obj[headers[index]] = value; 
     return obj 
    }, {}); 
    rows.push(row); 
    }; 
    return rows; 
} 

function bigqueryInsertData(data, tableName) { 
    var insertAllRequest = BigQuery.newTableDataInsertAllRequest(); 
    insertAllRequest.rows = convertValuesToRows(data); 
    var response = BigQuery.Tabledata.insertAll(insertAllRequest, PROJECT_ID, DATASET_ID, tableName); 
    if (response.insertErrors) { 
    Logger.log(response.insertErrors); 
    } 
} 

これは、例えば、(ヘッダ付き)文字列の2次元配列を取得し、BigQueryのが必要なフォーマットでそれをコードする(でgetValuesまたは実際Utilities.parseCsvから)

convertValuesToRowsを任意GASスタイル値行列を供給することができ

[["H1", "H2", "H3"], 
[1 , 2 , 3 ], 
[4 , 5 , 6 ]]; 

[{H1: 1, H2: 2, H3: 3}, 
{H1: 4, H2: 5, H3: 6}] 
が あなたが唯一のものとして第1の表現を心配する必要は

あなたはテーブルと一緒にbigQueryInsertDataに渡すものです キーと値のペアの形、すなわち、彼insertRows要求int型に追加されます(テーブルのスキーマはあなたが送信しているものと一致する必要があります)変換関数が内部から呼び出されます。

Utilities.parseCsvは、すでにあなたは基本的に適切なフォーマットにデータを得ることがcsvファイルを解析し、JSONでそれをコードするだけです、あなたはすでに方法を特定しbigQueryInsertData(Utilities.parseCsv(data.getDataAsString()), "myTable")

+0

私はあなたの答えをどのように利用するのかをはっきりと言うことができません。私はここで何を見ているのか理解しようとしているが、ちょっと混乱している。おそらくこのコードが何をしているのか説明できますか?私は何とか個々の行に1つずつ挿入するためにjsonを解析していますか? APIのスクリプトバージョンのドキュメントはどこかにありますか?私が行っているのは、スクリプトの自動補完だけです。 –

+0

更新された回答をご覧ください。 BigQuery APIを有効にしたら、この関数をそのまま使用できます。 –

+0

ありがとうございました!私のコードはエラーを投げずに実行されており、正常に動作すると主張していますが、BigQueryで実際にデータの更新が行われていることはありません。変更を登録するには数分かかるかもしれないと思っていますが、私は幸運で待っていて爽やかでしたので、すべてが機能しているかどうかはまだ分かりません。私のコードが不平を言っていなくても、実際に仕事をしていない場合、問題の内容についての洞察はありますか?私はあなたの機能が実行されていることを確認するために進捗状況を記録しました... Idkはおそらく1時間後にBigQueryが実際に動作したことを示します。 –

関連する問題