BigQuery:高可扩展的数据仓库
1. 与 BigQuery 交互
BigQuery 作为一个托管数据库,可通过其 API 进行访问,有多种便捷的交互方式:
-
云控制台 UI
:操作直观,适合初学者。
-
命令行 bq 工具
:适合熟练用户进行批量操作。
-
客户端库
:以 Node.js 客户端为例,可实现自动化和集成。
1.1 查询数据
BigQuery 的主要功能是查询数据,以下是使用云控制台 UI 查询共享公共数据集的步骤:
1. 打开云控制台,从左侧导航菜单中选择 BigQuery,进入专门的 BigQuery 页面。
2. 点击“公共数据集”,会看到一系列可用的数据集。
3. 选择一个数据集(如黄色出租车数据集),点击后可查看数据集摘要和表格列表。
4. 点击表格,可查看其架构,包括字段列表、数据类型和简短描述。需注意,所有字段都是可空的。
5. 点击顶部的“详情”标签,可查看表格的概述信息,如数据总量和行数。
例如,查询最昂贵的出租车行程:
SELECT total_amount, pickup_datetime, trip_distance
FROM `nyc-tlc.yellow.trips`
ORDER BY total_amount DESC
LIMIT 1;
在运行此查询前,需点击“显示选项”,取消勾选“使用旧版 SQL”,以使用新的语法。点击“运行查询”,BigQuery 通常会在约两秒内返回结果,并显示查询的数据量。
再如,查询一天中最常见的乘客上车时间:
SELECT HOUR(pickup_datetime) as hour, COUNT(*) as count
FROM `nyc-tlc.yellow.trips`
GROUP BY hour
ORDER BY count DESC;
若按星期几细分,可使用以下查询:
SELECT DAYOFWEEK(pickup_datetime) as day, HOUR(pickup_datetime) as hour,
COUNT(*) as count
FROM `nyc-tlc.yellow.trips`
GROUP BY day, hour
ORDER BY count DESC;
使用 Node.js 客户端库查询最昂贵的出租车行程的代码如下:
const BigQuery = require('@google-cloud/bigquery');
const bigquery = new BigQuery({
projectId: 'your-project-id',
keyFilename: 'key.json'
});
const query = `SELECT total_amount, pickup_datetime, trip_distance
FROM \`nyc-tlc.yellow.trips\`
ORDER BY total_amount DESC
LIMIT 1;`
bigquery.createQueryJob(query).then((data) => {
const job = data[0];
return job.getQueryResults({timeoutMs: 10000});
}).then((data) => {
const rows = data[0];
console.log(rows[0]);
});
若要查询所有行程的总费用,可使用以下查询:
SELECT SUM(total_amount) FROM `nyc-tlc.yellow.trips`;
将上述查询替换到代码中的
query
变量,运行后 BigQuery 的 API 会为未命名的聚合列自动生成字段名。
1.2 加载数据
BigQuery 支持多种数据加载方式,下面分别介绍批量加载和流式加载。
批量加载数据到 BigQuery
批量加载是指将大量任意数据(如 CSV 或 JSON 对象)加载到 BigQuery 表中,类似于 MySQL 的
LOAD DATA
查询。以下是使用云控制台 UI 进行批量加载的步骤:
1. 创建数据集:在 BigQuery 界面左侧,点击项目名称旁边的小箭头,选择“创建新数据集”。注意,BigQuery 的数据集和表 ID 不能包含连字符,通常使用下划线代替。设置数据集的 ID、存储位置和过期时间,点击“确定”。
2. 创建表:使用箭头菜单选择“创建新表”,在表单中设置表的架构。假设使用简化的出租车数据,包含上车和下车时间(TIMESTAMP 类型)以及票价(FLOAT 类型)。示例 CSV 数据如下:
1493033027,1493033627,8.42
1493033004,1493033943,18.61
1493033102,1493033609,9.17
1493032027,1493033801,24.97
- 定义表的架构:在“架构”部分定义表的字段,也可点击“以文本形式编辑”,使用 JSON 格式编辑架构:
[
{
"mode": "REQUIRED",
"name": "pickup_time",
"type": "TIMESTAMP"
},
{
"mode": "REQUIRED",
"name": "dropoff_time",
"type": "TIMESTAMP"
},
{
"mode": "REQUIRED",
"name": "fare_amount",
"type": "FLOAT"
}
]
- 选择数据源:可选择文件上传,也可将 CSV 文件上传到云存储或 Google 云端硬盘,使用其链接作为数据源。
- 点击“创建表”,BigQuery 会创建表并启动数据加载作业。加载完成后,可运行 SQL 查询验证数据,如查询行程的每分钟费用:
SELECT
TIMESTAMP_DIFF(dropoff_time, pickup_time, MINUTE) AS duration_minutes,
fare_amount,
fare_amount / TIMESTAMP_DIFF(dropoff_time, pickup_time, MINUTE) AS cost_per_minute
FROM
`your-project-id-here.taxi_test.trips`
LIMIT
1000;
若要从云存储加载数据,可在创建表时选择“Google 云存储”,输入 GCS 特定的 URL。
下面是批量加载数据的流程图:
graph LR
A[进入 BigQuery 界面] --> B[创建数据集]
B --> C[创建表]
C --> D[定义表架构]
D --> E[选择数据源]
E --> F[创建表并加载数据]
F --> G[查询验证数据]
流式数据到 BigQuery
当有新数据不断从应用程序流入时,流式加载更合适。使用 Node.js 客户端库流式加载新数据的示例代码如下:
const BigQuery = require('@google-cloud/bigquery');
const bigquery = new BigQuery({
projectId: 'your-project-id',
keyFilename: 'key.json'
});
const dataset = bigquery.dataset('taxi_test');
const table = dataset.table('trips');
const addTripToBigQuery = (trip) => {
return table.insert({
pickup_time: trip.pickup_time.getTime() / 1000,
dropoff_time: trip.dropoff_time.getTime() / 1000,
fare_amount: trip.fare_amount
});
}
在流式加载过程中,为避免重复加载同一行数据,可使用
insertId
进行去重。示例代码如下:
const uuid4 = require('uuid/v4');
const BigQuery = require('@google-cloud/bigquery');
const bigquery = new BigQuery({
projectId: 'your-project-id',
keyFilename: 'key.json'
});
// 后续代码省略,可根据具体需求实现使用 insertId 的逻辑
以下是流式加载数据的步骤列表:
1. 初始化 BigQuery 客户端。
2. 获取要插入数据的表的引用。
3. 定义包含新数据的对象。
4. 使用
insert
方法插入数据,并可选择提供
insertId
。
综上所述,BigQuery 提供了强大的查询和数据加载功能,无论是批量加载还是流式加载,都能满足不同场景的需求。通过合理使用这些功能,可高效地处理和分析大规模数据。
BigQuery:高可扩展的数据仓库(续)
2. BigQuery 功能优势总结
BigQuery 作为一个高可扩展的数据仓库,在数据查询和加载方面展现出了显著的优势,下面通过表格的形式进行总结:
| 功能 | 优势 | 示例说明 |
| — | — | — |
| 查询数据 | 速度快,能处理大规模数据 | 对 11 亿条记录的查询,在 BigQuery 中仅需约 2 秒,而在 PostgreSQL 中可能需要较长时间。如查询最昂贵的出租车行程,能快速返回结果。 |
| 查询数据 | 语法接近传统 SQL,易上手 | 提供类似传统 SQL 的查询语法,同时支持新的语法格式,方便用户使用。 |
| 查询数据 | 可灵活定制查询 | 可以根据不同的需求编写各种复杂的查询语句,如按小时、星期几等进行分组查询。 |
| 批量加载数据 | 支持多种数据源 | 可以从本地文件、云存储、Google 云端硬盘等加载数据,方便数据的整合。 |
| 批量加载数据 | 操作相对简单 | 通过云控制台 UI 可以轻松完成数据集和表的创建,以及数据的加载。 |
| 流式加载数据 | 适合实时数据处理 | 当有新数据不断从应用程序流入时,能及时将数据加载到 BigQuery 中。 |
| 流式加载数据 | 支持去重机制 | 可以使用
insertId
避免重复加载同一行数据,保证数据的准确性。 |
3. 实际应用场景分析
BigQuery 在不同的领域和场景中都有广泛的应用,以下是一些常见的应用场景分析:
3.1 交通出行领域
以出租车数据为例,通过对出租车行程数据的查询和分析,可以了解乘客的出行规律,如一天中不同时间段、不同星期几的乘客上车高峰时段。这有助于出租车公司合理安排车辆调度,提高运营效率。同时,还可以分析行程费用的分布情况,为制定合理的价格策略提供依据。
操作步骤如下:
1.
数据加载
:将出租车行程数据批量加载到 BigQuery 中,可使用云控制台 UI 或客户端库完成。
2.
数据查询
:编写 SQL 查询语句,如查询最昂贵的行程、按小时和星期几分组查询上车次数等。
3.
数据分析
:根据查询结果进行分析,得出有用的结论,如高峰时段、费用分布等。
3.2 电商领域
在电商领域,BigQuery 可以用于分析用户的行为数据,如用户浏览商品的记录、购买记录等。通过对这些数据的分析,可以了解用户的偏好,为个性化推荐提供支持。同时,还可以分析不同时间段的销售情况,为库存管理和营销策略制定提供依据。
操作步骤如下:
1.
数据集成
:将用户行为数据从不同的数据源(如网站日志、数据库等)流式加载到 BigQuery 中。
2.
数据挖掘
:使用 SQL 查询和分析工具,挖掘用户的行为模式和销售趋势。
3.
应用决策
:根据分析结果,制定个性化推荐策略、库存管理策略和营销策略。
4. 未来发展趋势展望
随着大数据技术的不断发展,BigQuery 也将不断演进和完善,以下是一些可能的发展趋势:
- 性能优化 :进一步提高查询和加载的性能,以应对不断增长的数据量和复杂的查询需求。
- 功能扩展 :增加更多的数据分析和处理功能,如机器学习集成、数据可视化等,为用户提供更全面的解决方案。
- 生态系统整合 :与更多的云服务和第三方工具进行整合,方便用户在不同的环境中使用 BigQuery。
下面是 BigQuery 未来发展趋势的流程图:
graph LR
A[性能优化] --> B[更快的查询和加载速度]
A --> C[支持更复杂的查询]
D[功能扩展] --> E[机器学习集成]
D --> F[数据可视化]
G[生态系统整合] --> H[与云服务整合]
G --> I[与第三方工具整合]
总之,BigQuery 作为一个强大的数据仓库,具有高可扩展性、快速查询和灵活的数据加载等优点。通过合理利用其功能,可以在不同的领域和场景中发挥重要作用。同时,随着技术的不断进步,BigQuery 也将不断发展,为用户提供更好的服务和体验。
超级会员免费看
2615

被折叠的 条评论
为什么被折叠?



