google-api-utility

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 (4)

基本介紹

教學目標

透過 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 的存取授權,接著再進行 Google BigQuery 資料的查詢應用,解決必須回傳龐大筆數的問題

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
100
101
102
103
104
105
106
107
108
109
110
111
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 - Get Large Query Result
var lists = [];
function get_query_large_result(auth, jobId, projectId, startIndex, callback) {
var bqurl = "https://www.googleapis.com/bigquery/v2/projects/" + projectId + "/queries/" + jobId + "?maxResults=" + 10000 + "&startIndex=" + startIndex + "&timeoutMs=" + 20000;
console.log(bqurl);
auth.request({
url: bqurl,
method: 'GET'
}, function(err, result){
if (err) {
console.log(err);
}
console.log(JSON.parse(result.body).totalRows);
try {
var rows = JSON.parse(result.body).rows;
for (var n=0; n<rows.length; n++) {
lists.push(rows[n]["f"][0]["v"]);
}
get_query_large_result(auth, jobId, projectId, startIndex + 10000, function(data) {
console.log(data);
})
} catch(err) {
console.log(lists);
console.log("\n總共資料筆數:" + lists.length);
}
});
}

function export_bigquery_large_query_result(auth, query, tableId, datasetId, projectId, callback) {
var bqurl = "https://www.googleapis.com/bigquery/v2/projects/" + projectId + "/jobs";
var jobId = datasetId + "_" + tableId + "_" + Date.now() + "_" + Math.floor(Math.random() * (1000 - 1 + 1));
var tableId = jobId;
var body = {
"jobReference": {
"projectId": projectId,
"jobId": jobId
},
"configuration": {
"query": {
"useQueryCache": false,
"destinationTable": {
"projectId": projectId,
"datasetId": datasetId,
"tableId": jobId
},
"writeDisposition": "WRITE_TRUNCATE",
"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);
}
check_table_already_exists(auth, tableId, datasetId, projectId, function(data) {
console.log(data);
})
});
}

function check_table_already_exists(auth, tableId, datasetId, projectId, callback) {
auth.request({
url: "https://www.googleapis.com/bigquery/v2/projects/" + projectId + "/datasets/" + datasetId + "/tables/" + tableId,
method: 'GET'
}, function(err, result) {
try {
var id = JSON.parse(result.body).id;
var jobId = id.split(".")[id.split(".").length-1];
if (jobId) {
console.log(jobId);
get_query_large_result(google_api_service,jobId,google_project_id,0);
}
} catch(err) {
check_table_already_exists(auth, tableId, datasetId, projectId, function(data) {
console.log(data);
});
}

})
}

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 = "publicdata:samples";
var datasetId = "wikipedia";
var projectId = "xxx";
var query = "SELECT id FROM [publicdata:samples.wikipedia] LIMIT 100000";
export_bigquery_large_query_result(google_api_service,query,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」,這五個基本參數要設定正確才能正常的執行。)

相關資源

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

基本介紹

教學目標

透過 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 。

使用教學

在瀏覽器網址列輸入 http://bigquery.cloud.google.com ,開啟 Google 開發人員管理平台。

在專案中新增資料集為 user ,接著在其中新增資料表為 data ,其中包括三個不同型態的欄位:

  1. id: INTEGER
  2. name: STRING
  3. timestamp: TIMESTAMP

進行 Google API 的存取授權,接著再進行 BigQuery 的查詢,最後將查詢內容轉成 JSON 物件回傳。

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
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);
}

// BigQuery - Insert
function bigquery_insert(auth, data, tableId, datasetId, projectId, callback) {
var bqurl = "https://www.googleapis.com/bigquery/v2/projects/" + projectId + "/datasets/" + datasetId + "/tables/" + tableId + "/insertAll";
var id = projectId + "_" + datasetId + "_" + tableId + "_" + Date.now();
var body = {
"kind": projectId + "_" + datasetId + "_" + tableId,
"rows": [
{
"insertId": projectId + "_" + datasetId + "_" + tableId + "_" + Date.now(),
"json": data
}
]
};
auth.request({
url: bqurl,
method: 'POST',
json: body
}, function(err, result){
callback(result.body);
});
}

google_api_auth("https://www.googleapis.com/auth/bigquery https://www.googleapis.com/auth/cloud-platform https://www.googleapis.com/auth/bigquery.insertdata ", "client_secrets.json", "key.pem", function(data) {
var google_api_service = data;
var tableId = "user";
var datasetId = "data";
var projectId = "xxx";
var data = {
id: 1,
name: "leoyeh",
timestamp: Date.now();
};
bigquery_insert(google_api_service,data,tableId,datasetId,projectId,function(data) {
console.log(data);
});
});

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

相關資源

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

基本介紹

教學目標

透過 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 的查詢,最後將查詢內容轉成 JSON 物件回傳。

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
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);
}

// BigQuery - Query
function bigquery_query(auth, query, datasetId, projectId, callback) {
var bqurl = "https://www.googleapis.com/bigquery/v2/projects/" + projectId + "/queries";
var body = {
"query": query,
"defaultDataset": {
"datasetId": datasetId,
"projectId": projectId
},
};
auth.request({
url: bqurl,
method: 'POST',
json: body
}, function(err, req, doc){
if(err) console.log(err);
var schema = new Object();
var result = new Array();
schema = doc.schema.fields
for (var n=0; n<doc.rows.length; n++) {
var row = doc.rows[n].f;
var data = new Object();
for (var i=0; i<schema.length; i++) {
data[schema[i].name] = row[i].v;
}
result.push(data);
}
callback(result);
});
}

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 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;";
var datasetId = "publicdata";
var projectId = "xxx";
bigquery_query(google_api_service,query,datasetId,projectId,function(data) {
console.log(data);
});
});

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

執行結果:

1
2
3
4
5
6
7
8
9
10
[ { repository_language: 'JavaScript', total: '372211' },
{ repository_language: 'Ruby', total: '259329' },
{ repository_language: 'Java', total: '223470' },
{ repository_language: 'Python', total: '193720' },
{ repository_language: 'C', total: '186949' },
{ repository_language: 'PHP', total: '177864' },
{ repository_language: 'C++', total: '102954' },
{ repository_language: 'Objective-C', total: '50522' },
{ repository_language: 'Shell', total: '45875' },
{ repository_language: 'C#', total: '44594' } ]

相關資源