50、BigQuery:高可扩展的数据仓库

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
  1. 定义表的架构:在“架构”部分定义表的字段,也可点击“以文本形式编辑”,使用 JSON 格式编辑架构:
[
    {
        "mode": "REQUIRED",
        "name": "pickup_time",
        "type": "TIMESTAMP"
    },
    {
        "mode": "REQUIRED",
        "name": "dropoff_time",
        "type": "TIMESTAMP"
    },
    {
        "mode": "REQUIRED",
        "name": "fare_amount",
        "type": "FLOAT"
    }
]
  1. 选择数据源:可选择文件上传,也可将 CSV 文件上传到云存储或 Google 云端硬盘,使用其链接作为数据源。
  2. 点击“创建表”,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 也将不断发展,为用户提供更好的服务和体验。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值