Felipe Hoffa使用 Hacker News API将Hacker News的数据导出到了Big Query,
https://bigquery.cloud.google.com/table/fh-bigquery:hackernews.comments
这是一个共享的表,BigQuery每天有1000次的免费查询额度,再利用Google Sheets来保存查询结果并进行数据可视化,实现一个低成本的在线大数据分析流程。
环境准备
不需要安装任何软件,只要有一个Google Account。打开以下两个页面:
https://bigquery.cloud.google.com/table/fh-bigquery:hackernews.comments
http://g.co/sheets
Google Sheets不仅提供数据保存和可视化,还集成了Googel Apps Script,天然支持BigQuery查询。
打开https://bigquery.cloud.google.com/table/fh-bigquery:hackernews.comments
进行一次简单的测试查询
1 2 3 4 5 6 7 8 9 10 11 12 13
| SELECT a.month month, stories, comments, comment_authors, story_authors FROM ( SELECT STRFTIME_UTC_USEC(time_ts, '%Y-%m') month, COUNT(*) stories, EXACT_COUNT_DISTINCT(author) story_authors FROM [fh-bigquery:hackernews.stories] GROUP BY 1 ) a JOIN ( SELECT STRFTIME_UTC_USEC(time_ts, '%Y-%m') month, COUNT(*) comments, EXACT_COUNT_DISTINCT(author) comment_authors FROM [fh-bigquery:hackernews.comments] GROUP BY 1 ) b ON a.month=b.month ORDER BY 1
|
表中的记录数和表大小
查询数据
新建一个Google Sheets
命名为Play Hacker News With BigQuery
开启BigQuery支持
点击Tools -> Script Editor...
,打开Google Apps Script编程界面。
点击Resouces -> Advanced Google Services...
,会先弹出保存保存项目对话框,输入项目名称,点击OK
。
启用BigQuery支持。
点击Google Developers Console
链接,在控制台上启用BigQuery。
启用API,并记录下URL中的Project ID(纯数字,图中被涂部分),获取数据时会用到。
获取数据
使用以下Googel Apps Script代码:
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
| function runQuery() { var projectNumber = '替换为前边提到的ProjectID'; if (projectNumber.length < 1) { var errMsg = "You forgot to set a project number - So no BQ for you!"; Logger.log(errMsg); Browser.msgBox(errMsg); return; } var sheet = SpreadsheetApp.getActiveSheet(); var sql = 'SELECT a.month month, stories, comments, comment_authors, story_authors FROM (SELECT STRFTIME_UTC_USEC(time_ts, \'%Y-%m\') month, '+ 'COUNT(*) stories, EXACT_COUNT_DISTINCT(author) story_authors FROM [fh-bigquery:hackernews.stories] GROUP BY 1 ) a JOIN '+ '(SELECT STRFTIME_UTC_USEC(time_ts, \'%Y-%m\') month, COUNT(*) comments, EXACT_COUNT_DISTINCT(author) comment_authors '+ 'FROM [fh-bigquery:hackernews.comments] GROUP BY 1 ) b ON a.month=b.month ORDER BY 1;'; var queryResults; try { var queryRequest = BigQuery.newQueryRequest(); queryRequest.setQuery(sql).setTimeoutMs(100000); queryResults = BigQuery.Jobs.query(queryRequest, projectNumber); } catch (err) { Logger.log(err); Browser.msgBox(err); return; } while (queryResults.getJobComplete() == false) { try { queryResults = BigQuery.Jobs.getQueryResults(projectNumber, queryJob.getJobReference().getJobId()); } catch (err) { Logger.log(err); Browser.msgBox(err); return; } } var resultCount = queryResults.getTotalRows(); var resultSchema = queryResults.getSchema(); var headers = queryResults.schema.fields.map(function(field) { return field.name; }); sheet.appendRow(headers); var resultValues = new Array(resultCount+1); var tableRows = queryResults.getRows(); for (var i = 0; i < tableRows.length; i++) { var cols = tableRows[i].getF(); resultValues[i] = new Array(cols.length); for (var j = 0; j < cols.length; j++) { resultValues[i][j] = cols[j].getV(); } } sheet.getRange(2, 1, resultCount, tableRows[0].getF().length).setValues(resultValues); Browser.msgBox("Yo yo! We are done with updating the results"); } function onOpen() { var sheet = SpreadsheetApp.getActiveSpreadsheet(); var menuEntries = [ {name: 'Run Query', functionName: 'runQuery'} ]; sheet.addMenu('BigQuery Example', menuEntries); };
|
保存,在方法下拉框中选择runQuery,点击运行(小三角图标)。
第一次运行需要一次性授权
授权完成,再点击一次运行。
运行完成,切换到新的Google Sheet页面,查看结果。
使用图表
利用Google Sheets提供的强大报表功能,让我们查询出来的数据变得更加具有表现力。
直接点击右下角的Explorer
浏览自动生成的报表,选择喜欢的插入入到文档中。
对报表再进行进一步的定制
最终的效果:
Play Hacker News With BigQuery的链接,可以自由打开,先看下效果。
https://docs.google.com/spreadsheets/d/1iMedOlxn_CBrvYERvap1kIz2l8mT2cqFag11OrmnIX4/edit?usp=sharing
总结
可以看出,对于大概4G的数据量进行BigQuery查询分析,是非常的快,并且利用Google Sheets进行结果展示,让大数据在云端飞起来。
希望看到更多利用大数据分析的应用来丰富我们的生活。
后记
BigQuery的免费使用额度为:10000个查询每天,1000G存储每月。