Google Storage

Node.js 雲端服務 - Google (5)

基本介紹

教學目標

透過 Node.js 進行 Google BigQuery 資料的讀取匯入應用,主要是將 Google Storage 中的 CSV 檔案匯入至表格中。

前置作業

  1. 申請 Google 雲端服務帳號。
  2. 建立 Google BigQuery 的大數據服務。
  3. 完成 Node.js 套件安裝與設置。

套件安裝

1
$ npm install google-api-utility --save

產生金鑰

在瀏覽器網址列輸入 https://console.developers.google.com/project,開啟 Google 開發人員管理平台。

接著透過以下的五大步驟產生存取金鑰:

  1. 「APIs & Auth」
  2. 「APIs」
  3. 「Create new Client ID」
  4. 「Service account」
  5. 「Create Client ID」

按下「Generate new P12 key」, 下載存取金錀相關的 .p12 檔案,預設私鑰的密碼是 notasecret 。

接著有兩種方式產生存取的金鑰。

方式一

1
2
$ openssl pkcs12 -in privatekey.p12 -out privatekey.pem -nocerts 
$ openssl rsa -in privatekey.pem -out key.pem

方式二

1
$ openssl pkcs12 -in privatekey.p12 -nodes -nocerts > key.pem

按下「Generate new JSON key」,下載存取金錀相關的 JSON 檔案,接著命名為 client_secrets.json 。

使用教學

進行 Google API 的存取授權,接著再進行 Google BigQuery 資料的讀取匯入應用,主要將 Google Storage 中 CSV 檔案讀取至表格中。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
var auth = require('google-api-utility');

// Google API - Auth
function google_api_auth(scope, client_secret, key_pem, callback) {
auth.init({
scope: scope,
client_secret: client_secret,
key_pem: key_pem
});
callback(auth);
}

// Google BigQuery - Load Data From Google Storage File
function import_storage_file_to_table(auth, sourceUris, fields, tableId, datasetId, projectId, callback) {
var bqurl = "https://www.googleapis.com/bigquery/v2/projects/" + projectId + "/jobs";
var id = datasetId + "_" + tableId + "_" + Date.now() + "_" + Math.floor(Math.random() * (1000 - 1 + 1));
var body = {
"projectId": projectId,
"configuration": {
"load": {
"destinationTable": {
"projectId": projectId,
"datasetId": datasetId,
"tableId": "tableId"
},
"schema":{
"fields":[{"name":"id","type":"INTEGER"},
{"name":"name","type":"STRING"}]
},
"skipLeadingRows": 1,
"sourceUris": sourceUris
}
}
};

console.log("Import...");
auth.request({
url: bqurl,
method: 'POST',
json: body
}, function(err, result){
if (err) {
console.log(err);
}
console.log(result);
});
}

google_api_auth("https://www.googleapis.com/auth/bigquery https://www.googleapis.com/auth/cloud-platform https://www.googleapis.com/auth/devstorage.full_control", "client_secrets.json", "key.pem", function(data) {
var google_api_service = data;
var tableId = "XXX";
var datasetId = "YYY";
var projectId = "xxx";
var fields = [{"name":"id","type":"INTEGER"},
{"name":"name","type":"STRING"}];
var sourceUris = ['gs://XXX/YYY.csv']
import_storage_file_to_table(google_api_service,sourceUris,fields,tableId,datasetId
,projectId,function(data) {
console.log(data);
});
});

(註: 範例程式碼中必需設定適當的「client_secret」、「key_pem」、「tableId」、「datasetId」和「projectId」,這五個基本參數要設定正確才能正常的執行。)

相關資源

Node.js 雲端服務 - Google (3)

基本介紹

教學目標

透過 Node.js 進行 Google BigQuery 資料的轉換應用。

前置作業

  1. 申請 Google 雲端服務帳號。
  2. 建立 Google BigQuery 的大數據服務。
  3. 完成 Node.js 套件安裝與設置。

套件安裝

1
$ npm install google-api-utility --save

產生金鑰

在瀏覽器網址列輸入 https://console.developers.google.com/project,開啟 Google 開發人員管理平台。

接著透過以下的五大步驟產生存取金鑰:

  1. 「APIs & Auth」
  2. 「APIs」
  3. 「Create new Client ID」
  4. 「Service account」
  5. 「Create Client ID」

按下「Generate new P12 key」, 下載存取金錀相關的 .p12 檔案,預設私鑰的密碼是 notasecret 。

接著有兩種方式產生存取的金鑰。

方式一

1
2
$ openssl pkcs12 -in privatekey.p12 -out privatekey.pem -nocerts 
$ openssl rsa -in privatekey.pem -out key.pem

方式二

1
$ openssl pkcs12 -in privatekey.p12 -nodes -nocerts > key.pem

按下「Generate new JSON key」,下載存取金錀相關的 JSON 檔案,接著命名為 client_secrets.json 。

使用教學

進行 Google API 的存取授權,接著再進行 BigQuery 資料的轉換,基本上可分成兩個階段:

  1. 將查詢結果匯出成新的表格內容。
  2. 將特定表格匯出至儲存空間中的檔案。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
var auth = require('google-api-utility');

// Google API - Auth
function google_api_auth(scope, client_secret, key_pem, callback) {
auth.init({
scope: scope,
client_secret: client_secret,
key_pem: key_pem
});
callback(auth);
}

// Google BigQuery - Query To Table
function export_bigquery_query_to_table(auth, query, tableId, datasetId, projectId, callback) {
var bqurl = "https://www.googleapis.com/bigquery/v2/projects/" + projectId + "/jobs";
var id = "export_bigquery_query_to_table_" + datasetId + "_" + tableId + "_" + Date.now() + "_" + Math.floor(Math.random() * (1000 - 1 + 1));
var body = {

"jobReference": {
"projectId": projectId,
"jobId": id
},
"configuration": {

"query": {
"useQueryCache": false,
"destinationTable": {
"projectId": projectId,
"datasetId": "backup",
"tableId": "user_preference_20141220"
},
"writeDisposition": "WRITE_APPEND",
"createDisposition": "CREATE_IF_NEEDED",
"allowLargeResults": true,
"query": query
}
}
};
console.log("Export...");
auth.request({
url: bqurl,
method: 'POST',
json: body
}, function(err, result){
if (err) {
console.log(err);
}
console.log(result.body);
});
}

// Google BigQuery - Table To Storage
function export_bigquery_table_to_storage(auth, destinationUris, tableId, datasetId, projectId, callback) {
var bqurl = "https://www.googleapis.com/bigquery/v2/projects/" + projectId + "/jobs";
var id = "export_bigquery_table_to_storage_" + datasetId + "_" + tableId + "_" + Date.now() + "_" + Math.floor(Math.random() * (1000 - 1 + 1));
var body = {
"jobReference": {
"projectId": projectId,
"jobId": id
},
"configuration": {
"extract": {
"sourceTable": {
"projectId": projectId,
"datasetId": datasetId,
"tableId": tableId
},
'destinationUris': destinationUris,
}
}
};
console.log("Export...");
auth.request({
url: bqurl,
method: 'POST',
json: body
}, function(err, result){
if (err) {
console.log(err);
}
callback(result.body);
});
}

google_api_auth("https://www.googleapis.com/auth/bigquery https://www.googleapis.com/auth/cloud-platform", "client_secrets.json", "key.pem", function(data) {
var google_api_service = data;
var tableId = "github";
var datasetId = "language_rank";
var projectId = "xxx";
var destinationUris = ['gs://statistics_data/github-language_rank-*'];
var query = "select repository.language, count(*) as total from publicdata:samples.github_nested where repository.language is not null group by repository.language order by total desc limit 10;";

export_bigquery_query_to_table(google_api_service,query,tableId,datasetId,projectId,function(data) {
console.log(data);
});
export_bigquery_table_to_storage(google_api_service,destinationUris,tableId,datasetId,projectId,function(data) {
console.log(data);
});
});

(註: 範例程式碼中必需設定適當的「client_secret」、「key_pem」、「tableId」、「datasetId」和「projectId」,這五個基本參數要設定正確才能正常的執行。)

相關資源