将Bigquery数据重定向到预测

时间:2016-02-15 15:48:52

标签: google-sheets google-bigquery google-prediction data-science

我们正在Google的电子表格中开发POC。

有一些配置,但简而言之,它从BigQuery下载数据并将其重定向到预测。

我们的Bigquery表有超过41Mb,Spreadsheets不允许/不支持。

我们考虑过来自Bigquery的5Mb数据的下载包。 尽管Predicition API为insert大量数据提供了方法,但update方法只允许上传一行/实例。

有没有办法将Bigquery数据直接重定向到预测?

涉及的主要三个功能是:



/**
 * 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;
}
&#13;
&#13;
&#13;

问候。

1 个答案:

答案 0 :(得分:1)

此时BigQuery与Prediction Api之间没有直接联系,但两者都与Google云端存储集成。

对于培训新模型,您可以将BigQuery数据作为CSV文件导出到GCS,然后将该文件插入到预测Api中。

为了从BigQuery数据更新现有模型,您将不得不做更多的工作,因为Prediction api支持对现有模型的单行插入,但BigQuery仅提供批量导出到GCS或通过bigquery.tabledata.list进行远程读取。您需要进行一些处理以从BigQuery中提取数据,并将其一次一行插入到预测模型中。

使用Google Apps脚本从Google电子表格中访问BigQuery会打开很多简单的集成选项,但也会受到Apps脚本强加的处理限制,例如最大文件上传大小......您可能会发现其他框架更灵活。 Cloud Dataflow会为你效力吗? Google App Engine怎么样?