将 Bigquery 数据重定向到预测
Redirect Bigquery Data to Prediction
我们正在 Google 的电子表格中开发 POC。
有一些配置,但简而言之,它从 BigQuery 下载数据并将其重定向到 Prediction。
我们的 Bigquery 表超过了 41Mb,而 Spreadsheets 没有 allowed/supported。
我们考虑从 Bigquery 下载 5Mb 数据包。
虽然 Predicition API 提供方法 insert lots of data, the update 方法只允许上传一个 line/instance.
有没有办法将 Bigquery 数据直接重定向到 Prediction?
主要涉及的三个函数是:
/**
* this function downloads data from Bigquery
* for a given table, it receives the columns supposed to be downloaded
*
* @params
* - modelName // the new prediction model name
* - columns // an array of columns
* - table // the table name
* - dataset // the dataset name
*/
function createPrediction(modelName, columns, table, dataset) {
try {
var rows = simpleQuery(columns, table, dataset);
var rowsL = rows.length;
var trainingL = parseInt(0.9 * rowsL, 10);
var training_instances = [];
for (var i = 0; i < trainingL; i++) {
training_instances.push({'output': rows[i].f[0].v, 'csvInstance': rows[i].f[1].v});
}
var resource = {'id': modelName, 'trainingInstances': training_instances};
var insert_reply = Prediction.Trainedmodels.insert(resource, c_projectId);
c_modelName = modelName;
Browser.msgBox('Insert reply:' + insert_reply, Browser.Buttons.OK);
} catch (err) {
Browser.msgBox('ERROR: ' + err, Browser.Buttons.OK);
}
}
/**
* this function should receive a dataset name, a table name and some columns' names
* it is supposed to return the "SELECT [COLUMNS] FROM [DATASET.TABLE]"
*
* @params:
* -
*/
function simpleQuery(columns, table, dataset, projectId) {
projectId = projectId || c_projectId;
return getQuery("SELECT " + columns.join(",") + " FROM [" + dataset + "." + table + "]", projectId);
}
/**
* this function should return the result for a given query
*
* @params:
* - query // the query to be evaluated
* - projectId // the googles's project id
*/
function getQuery(query, projectId) {
var request = {
query: query
};
var queryResults = BigQuery.Jobs.query(request, projectId);
var jobId = queryResults.jobReference.jobId;
// Check on status of the Query Job.
var sleepTimeMs = 500;
while (!queryResults.jobComplete) {
Utilities.sleep(sleepTimeMs);
sleepTimeMs *= 2;
queryResults = BigQuery.Jobs.getQueryResults(projectId, jobId);
}
// Get all the rows of results.
var rows = queryResults.rows;
while (queryResults.pageToken) {
queryResults = BigQuery.Jobs.getQueryResults(projectId, jobId, {
pageToken: queryResults.pageToken
});
rows = rows.concat(queryResults.rows);
}
return rows;
}
此致。
此时 BigQuery 和 Prediction Api 之间没有直接连接,但两者都与 Google Cloud Storage 集成。
为了训练新模型,您可以将 BigQuery 数据作为 CSV 文件导出到 GCS,然后将该文件插入预测 Api。
要从 BigQuery 数据更新现有模型,您将不得不做更多的工作,因为预测 api 支持对现有模型的单行插入,但 BigQuery 仅提供批量导出到 GCS 或远程读取通过 bigquery.tabledata.list
。您将需要进行一些处理以从 BigQuery 中提取数据并将其一次插入一行到您的预测模型中。
使用 Google Apps 脚本从 Google 电子表格中访问 BigQuery 打开了许多简单的集成选项,但 Apps 脚本也施加了处理限制,例如最大文件上传大小...您可能会发现其他框架更灵活。会 Cloud Dataflow work for you? How about Google App Engine 吗?
我们正在 Google 的电子表格中开发 POC。
有一些配置,但简而言之,它从 BigQuery 下载数据并将其重定向到 Prediction。
我们的 Bigquery 表超过了 41Mb,而 Spreadsheets 没有 allowed/supported。
我们考虑从 Bigquery 下载 5Mb 数据包。 虽然 Predicition API 提供方法 insert lots of data, the update 方法只允许上传一个 line/instance.
有没有办法将 Bigquery 数据直接重定向到 Prediction?
主要涉及的三个函数是:
/**
* this function downloads data from Bigquery
* for a given table, it receives the columns supposed to be downloaded
*
* @params
* - modelName // the new prediction model name
* - columns // an array of columns
* - table // the table name
* - dataset // the dataset name
*/
function createPrediction(modelName, columns, table, dataset) {
try {
var rows = simpleQuery(columns, table, dataset);
var rowsL = rows.length;
var trainingL = parseInt(0.9 * rowsL, 10);
var training_instances = [];
for (var i = 0; i < trainingL; i++) {
training_instances.push({'output': rows[i].f[0].v, 'csvInstance': rows[i].f[1].v});
}
var resource = {'id': modelName, 'trainingInstances': training_instances};
var insert_reply = Prediction.Trainedmodels.insert(resource, c_projectId);
c_modelName = modelName;
Browser.msgBox('Insert reply:' + insert_reply, Browser.Buttons.OK);
} catch (err) {
Browser.msgBox('ERROR: ' + err, Browser.Buttons.OK);
}
}
/**
* this function should receive a dataset name, a table name and some columns' names
* it is supposed to return the "SELECT [COLUMNS] FROM [DATASET.TABLE]"
*
* @params:
* -
*/
function simpleQuery(columns, table, dataset, projectId) {
projectId = projectId || c_projectId;
return getQuery("SELECT " + columns.join(",") + " FROM [" + dataset + "." + table + "]", projectId);
}
/**
* this function should return the result for a given query
*
* @params:
* - query // the query to be evaluated
* - projectId // the googles's project id
*/
function getQuery(query, projectId) {
var request = {
query: query
};
var queryResults = BigQuery.Jobs.query(request, projectId);
var jobId = queryResults.jobReference.jobId;
// Check on status of the Query Job.
var sleepTimeMs = 500;
while (!queryResults.jobComplete) {
Utilities.sleep(sleepTimeMs);
sleepTimeMs *= 2;
queryResults = BigQuery.Jobs.getQueryResults(projectId, jobId);
}
// Get all the rows of results.
var rows = queryResults.rows;
while (queryResults.pageToken) {
queryResults = BigQuery.Jobs.getQueryResults(projectId, jobId, {
pageToken: queryResults.pageToken
});
rows = rows.concat(queryResults.rows);
}
return rows;
}
此致。
此时 BigQuery 和 Prediction Api 之间没有直接连接,但两者都与 Google Cloud Storage 集成。
为了训练新模型,您可以将 BigQuery 数据作为 CSV 文件导出到 GCS,然后将该文件插入预测 Api。
要从 BigQuery 数据更新现有模型,您将不得不做更多的工作,因为预测 api 支持对现有模型的单行插入,但 BigQuery 仅提供批量导出到 GCS 或远程读取通过 bigquery.tabledata.list
。您将需要进行一些处理以从 BigQuery 中提取数据并将其一次插入一行到您的预测模型中。
使用 Google Apps 脚本从 Google 电子表格中访问 BigQuery 打开了许多简单的集成选项,但 Apps 脚本也施加了处理限制,例如最大文件上传大小...您可能会发现其他框架更灵活。会 Cloud Dataflow work for you? How about Google App Engine 吗?