乐趣区

关于大数据:数仓架构瘦身Hologres-5000CU时免费试用

Hologres 基于翻新的 HSAP 架构,能够将您原先数仓架构中的 OLAP 零碎(Greenplum、Presto、Impala、ClickHouse)、KV 数据库 /Serving 零碎(HBase、Redis)对立在一个大数据计算引擎中,并提供疾速的离线实时一体化剖析能力。

  • Hologres 5000CU 时,20GB 存储收费试用, 返回试用 >>

产品外围劣势:

1、简化数仓架构,缩小数据搬运与多处保护老本

2、实时查问性能强,刷新 TPC-H 30000GB 世界纪录

3、交融湖仓查问,0 ETL 导入离线 MaxCompute 数据

Hologres 应用教程简介

基于 MaxCompute 中 TPC- H 数据集数据和 GitHub 公开事件数据,在阿里云实时数仓 Hologres 上创立 Hologres 的数据库、内部表、外部表、导入数据至外部表中以及应用 Hologres 别离查问外部表和内部表中数据的指引。Hologres 在查问数据方面具备极速响应的劣势。

筹备环境和资源

开始教程前,请按以下步骤筹备环境和资源:

  1. 已创立专有网络(VPC)和专有网络交换机,详情请参见创立专有网络和交换机。
  2. 拜访阿里云收费试用。单击页面右上方的 登录 / 注册 按钮,并依据页面提醒实现账号登录(已有阿里云账号)、账号注册(尚无阿里云账号)或实名认证(依据试用产品要求实现集体实名认证或企业实名认证)。
  3. 胜利登录后,在 产品类别 下抉择 大数据计算 > 数据计算与剖析 ,在 实时数仓 Hologres卡片上,单击 立刻试用
  4. 在弹出的试用 实时数仓 Hologres产品的面板上实现参数信息配置。本试用教程以表格中的参数信息为例,未提及参数放弃默认值。
参数 示例值
地区 华东 1(杭州)
实例类型 通用型
计算资源 8 核 32GB(计算节点数量:1)
专有网络 抉择步骤 1 中创立的 VPC。
专有网络交换机 抉择步骤 1 中创立的交换机。
实例名称 hologres_test
资源组 默认资源组
  1. 勾选服务协定后,单击 立刻试用 ,并依据页面提醒实现试用申请。
    单击 返回控制台,开启试用体验。

创立数据库

通过 Hologres 疾速创立数据库,用于后续寄存示例数据进行查问应用。

  1. 登录 Hologres 治理控制台,单击左侧 实例列表
  2. 实例列表 页面,单击对应实例名称。
  3. 实例详情页 左侧导航栏,单击 数据库治理
  4. DB 受权 页面,单击右上角 新增数据库
  5. 新增数据库 对话框,配置如下参数。
题目 阐明
实例名 抉择在哪个 Hologres 实例上创立数据库。默认展现以后已登录实例的名称,您也能够在下拉框中抉择其余 Hologres 实例。
数据库名称 本示例数据库名称设置为holo_tutorial
简略权限策略 您能够为创立的数据库抉择一种权限策略。更多对于权限策略的阐明,请参见:- SPM:简略权限模型,该权限模型受权是以 DB 为粒度,划分 admin(管理员)、developer(开发者)、writer(读写者)以及 viewer(分析师)四种角色,您能够通过大量的权限治理函数,即可对 DB 中的对象进行不便且平安的权限治理。- SLPM:基于 Schema 级别的简略权限模型,该权限模型以 Schema 为粒度,划分 <db>.admin(DB 管理员)、<db>.<schema>.developer(开发者)、<db>.<schema>.writer(读写者)以及 <db>.<schema>.viewer(分析师),相比于简略权限模型更为细粒度。- 专家:Hologres 兼容 PostgreSQL,应用与 Postgres 完全一致的权限零碎。
  1. 单击 确认

创立表

数据库创立胜利后,您需在数据库中创立对应的表。

  1. 登录数据库。
    1. DB 受权 页面的顶部菜单栏,单击 元数据管理
    2. 元数据管理 页面,双击左侧目录树中已创立胜利的数据库名称,单击 确认
  1. 新建内部表。
    1. SQL 编辑器 页面,单击左上角的图标。
    2. 新增应用 TPC- H 数据集数据的内部表,TPC- H 数据援用自 TPC,更多信息请参见 TPC。
      在新增的 长期 Query 查问 页面,抉择已创立的 实例名 数据库 后,请您在 SQL 查问的编辑框输出示例代码,单击 运行
      示例 SQL 语句用来创立一个映射到 MaxCompute 公共空间 MAXCOMPUTE_PUBLIC_DATA 中 odps_customer_10g、odps_lineitem_10g 等表的内部表,用于后续查问。
DROP FOREIGN TABLE IF EXISTS odps_customer_10g;
DROP FOREIGN TABLE IF EXISTS odps_lineitem_10g;
DROP FOREIGN TABLE IF EXISTS odps_nation_10g;
DROP FOREIGN TABLE IF EXISTS odps_orders_10g;
DROP FOREIGN TABLE IF EXISTS odps_part_10g;
DROP FOREIGN TABLE IF EXISTS odps_partsupp_10g;
DROP FOREIGN TABLE IF EXISTS odps_region_10g;
DROP FOREIGN TABLE IF EXISTS odps_supplier_10g;
IMPORT FOREIGN SCHEMA "MAXCOMPUTE_PUBLIC_DATA#default" LIMIT to
(
    odps_customer_10g,
    odps_lineitem_10g,
    odps_nation_10g,
    odps_orders_10g,
    odps_part_10g,
    odps_partsupp_10g,
    odps_region_10g,
    odps_supplier_10g
) 
FROM SERVER odps_server INTO public OPTIONS(if_table_exist 'error',if_unsupported_type 'error');
    1. 新增应用 GitHub 公开事件数据的内部表,数据援用自 GitHub,更多信息请参见基于 GitHub 公开事件数据集的离线实时一体化实际。
      单击左上角的图标,在新增的 长期 Query 查问 页面,抉择已创立的 实例名 数据库 后,请您在 SQL 查问的编辑框输出示例代码,单击 运行
      示例 SQL 语句用来创立一个映射到 MaxCompute 公共空间 MAXCOMPUTE_PUBLIC_DATA 中 github_eventsSchema 下名为dwd_github_events_odps 的内部表,用于后续查问。
DROP FOREIGN TABLE IF EXISTS dwd_github_events_odps;
IMPORT FOREIGN SCHEMA "MAXCOMPUTE_PUBLIC_DATA#github_events" LIMIT to
(dwd_github_events_odps) 
FROM SERVER odps_server INTO public OPTIONS(if_table_exist 'error',if_unsupported_type 'error');
  1. 新建外部表。
    1. SQL 编辑器 页面,单击左上角的图标。
    2. 新建应用 TPC- H 数据集数据的外部表。
      在新增的 长期 Query 查问 页面,抉择已创立的 实例名 数据库 后,请您在 SQL 查问的编辑框输出如下语句,单击 运行
      示例 SQL 语句用来创立名称别离为 LINEITEM、ORDERS、PARTSUPP、PART、CUSTOMER、SUPPLIER、NATION 和 REGION 的表,用于后续存储数据。
DROP TABLE IF EXISTS LINEITEM;
BEGIN;
CREATE TABLE LINEITEM
(
    L_ORDERKEY      BIGINT      NOT NULL,
    L_PARTKEY       INT         NOT NULL,
    L_SUPPKEY       INT         NOT NULL,
    L_LINENUMBER    INT         NOT NULL,
    L_QUANTITY      DECIMAL(15,2) NOT NULL,
    L_EXTENDEDPRICE DECIMAL(15,2) NOT NULL,
    L_DISCOUNT      DECIMAL(15,2) NOT NULL,
    L_TAX           DECIMAL(15,2) NOT NULL,
    L_RETURNFLAG    TEXT        NOT NULL,
    L_LINESTATUS    TEXT        NOT NULL,
    L_SHIPDATE      TIMESTAMPTZ NOT NULL,
    L_COMMITDATE    TIMESTAMPTZ NOT NULL,
    L_RECEIPTDATE   TIMESTAMPTZ NOT NULL,
    L_SHIPINSTRUCT  TEXT        NOT NULL,
    L_SHIPMODE      TEXT        NOT NULL,
    L_COMMENT       TEXT        NOT NULL,
    PRIMARY KEY (L_ORDERKEY,L_LINENUMBER)
);
CALL set_table_property('LINEITEM', 'clustering_key', 'L_SHIPDATE,L_ORDERKEY');
CALL set_table_property('LINEITEM', 'segment_key', 'L_SHIPDATE');
CALL set_table_property('LINEITEM', 'distribution_key', 'L_ORDERKEY');
CALL set_table_property('LINEITEM', 'bitmap_columns', 'L_ORDERKEY,L_PARTKEY,L_SUPPKEY,L_LINENUMBER,L_RETURNFLAG,L_LINESTATUS,L_SHIPINSTRUCT,L_SHIPMODE,L_COMMENT');
CALL set_table_property('LINEITEM', 'dictionary_encoding_columns', 'L_RETURNFLAG,L_LINESTATUS,L_SHIPINSTRUCT,L_SHIPMODE,L_COMMENT');
CALL set_table_property('LINEITEM', 'time_to_live_in_seconds', '31536000');
COMMIT;
DROP TABLE IF EXISTS ORDERS;
BEGIN;
CREATE TABLE ORDERS
(
    O_ORDERKEY      BIGINT      NOT NULL PRIMARY KEY,
    O_CUSTKEY       INT         NOT NULL,
    O_ORDERSTATUS   TEXT        NOT NULL,
    O_TOTALPRICE    DECIMAL(15,2) NOT NULL,
    O_ORDERDATE     timestamptz NOT NULL,
    O_ORDERPRIORITY TEXT        NOT NULL,
    O_CLERK         TEXT        NOT NULL,
    O_SHIPPRIORITY  INT         NOT NULL,
    O_COMMENT       TEXT        NOT NULL
);
CALL set_table_property('ORDERS', 'segment_key', 'O_ORDERDATE');
CALL set_table_property('ORDERS', 'distribution_key', 'O_ORDERKEY');
CALL set_table_property('ORDERS', 'bitmap_columns', 'O_ORDERKEY,O_CUSTKEY,O_ORDERSTATUS,O_ORDERPRIORITY,O_CLERK,O_SHIPPRIORITY,O_COMMENT');
CALL set_table_property('ORDERS', 'dictionary_encoding_columns', 'O_ORDERSTATUS,O_ORDERPRIORITY,O_CLERK,O_COMMENT');
CALL set_table_property('ORDERS', 'time_to_live_in_seconds', '31536000');
COMMIT;
DROP TABLE IF EXISTS PARTSUPP;
BEGIN;
CREATE TABLE PARTSUPP
(
    PS_PARTKEY    INT    NOT NULL,
    PS_SUPPKEY    INT    NOT NULL,
    PS_AVAILQTY   INT    NOT NULL,
    PS_SUPPLYCOST DECIMAL(15,2) NOT NULL,
    PS_COMMENT    TEXT   NOT NULL,
    PRIMARY KEY(PS_PARTKEY,PS_SUPPKEY)
);
CALL set_table_property('PARTSUPP', 'distribution_key', 'PS_PARTKEY');
CALL set_table_property('PARTSUPP', 'colocate_with', 'LINEITEM');
CALL set_table_property('PARTSUPP', 'bitmap_columns', 'PS_PARTKEY,PS_SUPPKEY,PS_AVAILQTY,PS_COMMENT');
CALL set_table_property('PARTSUPP', 'dictionary_encoding_columns', 'PS_COMMENT');
CALL set_table_property('PARTSUPP', 'time_to_live_in_seconds', '31536000');
COMMIT;
DROP TABLE IF EXISTS PART;
BEGIN;
CREATE TABLE PART
(
    P_PARTKEY     INT    NOT NULL PRIMARY KEY,
    P_NAME        TEXT   NOT NULL,
    P_MFGR        TEXT   NOT NULL,
    P_BRAND       TEXT   NOT NULL,
    P_TYPE        TEXT   NOT NULL,
    P_SIZE        INT    NOT NULL,
    P_CONTAINER   TEXT   NOT NULL,
    P_RETAILPRICE DECIMAL(15,2) NOT NULL,
    P_COMMENT     TEXT   NOT NULL
);
CALL set_table_property('PART', 'distribution_key', 'P_PARTKEY');
CALL set_table_property('PART', 'bitmap_columns', 'P_PARTKEY,P_SIZE,P_NAME,P_MFGR,P_BRAND,P_TYPE,P_CONTAINER,P_COMMENT');
CALL set_table_property('PART', 'dictionary_encoding_columns', 'P_NAME,P_MFGR,P_BRAND,P_TYPE,P_CONTAINER,P_COMMENT');
CALL set_table_property('PART', 'time_to_live_in_seconds', '31536000');
COMMIT;
DROP TABLE IF EXISTS CUSTOMER;
BEGIN;
CREATE TABLE CUSTOMER
(
    C_CUSTKEY    INT    NOT NULL PRIMARY KEY,
    C_NAME       TEXT   NOT NULL,
    C_ADDRESS    TEXT   NOT NULL,
    C_NATIONKEY  INT    NOT NULL,
    C_PHONE      TEXT   NOT NULL,
    C_ACCTBAL    DECIMAL(15,2) NOT NULL,
    C_MKTSEGMENT TEXT   NOT NULL,
    C_COMMENT    TEXT   NOT NULL
);
CALL set_table_property('CUSTOMER', 'distribution_key', 'C_CUSTKEY');
CALL set_table_property('CUSTOMER', 'bitmap_columns', 'C_CUSTKEY,C_NATIONKEY,C_NAME,C_ADDRESS,C_PHONE,C_MKTSEGMENT,C_COMMENT');
CALL set_table_property('CUSTOMER', 'dictionary_encoding_columns', 'C_NAME,C_ADDRESS,C_PHONE,C_MKTSEGMENT,C_COMMENT');
CALL set_table_property('CUSTOMER', 'time_to_live_in_seconds', '31536000');
COMMIT;
DROP TABLE IF EXISTS SUPPLIER;
BEGIN;
CREATE TABLE SUPPLIER
(
    S_SUPPKEY   INT    NOT NULL PRIMARY KEY,
    S_NAME      TEXT   NOT NULL,
    S_ADDRESS   TEXT   NOT NULL,
    S_NATIONKEY INT    NOT NULL,
    S_PHONE     TEXT   NOT NULL,
    S_ACCTBAL   DECIMAL(15,2) NOT NULL,
    S_COMMENT   TEXT   NOT NULL
);
CALL set_table_property('SUPPLIER', 'distribution_key', 'S_SUPPKEY');
CALL set_table_property('SUPPLIER', 'bitmap_columns', 'S_SUPPKEY,S_NAME,S_ADDRESS,S_NATIONKEY,S_PHONE,S_COMMENT');
CALL set_table_property('SUPPLIER', 'dictionary_encoding_columns', 'S_NAME,S_ADDRESS,S_PHONE,S_COMMENT');
CALL set_table_property('SUPPLIER', 'time_to_live_in_seconds', '31536000');
COMMIT;
DROP TABLE IF EXISTS NATION;
BEGIN;
CREATE TABLE NATION(
  N_NATIONKEY INT NOT NULL PRIMARY KEY,
  N_NAME text NOT NULL,
  N_REGIONKEY INT NOT NULL,
  N_COMMENT text NOT NULL
);
CALL set_table_property('NATION', 'distribution_key', 'N_NATIONKEY');
CALL set_table_property('NATION', 'bitmap_columns', 'N_NATIONKEY,N_NAME,N_REGIONKEY,N_COMMENT');
CALL set_table_property('NATION', 'dictionary_encoding_columns', 'N_NAME,N_COMMENT');
CALL set_table_property('NATION', 'time_to_live_in_seconds', '31536000');
COMMIT;
DROP TABLE IF EXISTS REGION;
BEGIN;
CREATE TABLE REGION
(
    R_REGIONKEY INT  NOT NULL PRIMARY KEY,
    R_NAME      TEXT NOT NULL,
    R_COMMENT   TEXT
);
CALL set_table_property('REGION', 'distribution_key', 'R_REGIONKEY');
CALL set_table_property('REGION', 'bitmap_columns', 'R_REGIONKEY,R_NAME,R_COMMENT');
CALL set_table_property('REGION', 'dictionary_encoding_columns', 'R_NAME,R_COMMENT');
CALL set_table_property('REGION', 'time_to_live_in_seconds', '31536000');
COMMIT;
    1. 新增应用 GitHub 公开事件数据的外部表。
      单击左上角的图标,在新增的 长期 Query 查问 页面,抉择已创立的 实例名 数据库 后,请您在 SQL 查问的编辑框输出示例代码,单击 运行
      示例 SQL 语句用来创立名称为 gh_event_data 的外部表,并设置 distribution_key、event_time_column、clustering_key 的表属性,用于后续数据导入和高性能查问。
DROP TABLE IF EXISTS gh_event_data;
BEGIN;
CREATE TABLE gh_event_data (
    id bigint,
    actor_id bigint,
    actor_login text,
    repo_id bigint,
    repo_name text,
    org_id bigint,
    org_login text,
    type text,
    created_at timestamp with time zone NOT NULL,
    action text,
    iss_or_pr_id bigint,
    number bigint,
    comment_id bigint,
    commit_id text,
    member_id bigint,
    rev_or_push_or_rel_id bigint,
    ref text,
    ref_type text,
    state text,
    author_association text,
    language text,
    merged boolean,
    merged_at timestamp with time zone,
    additions bigint,
    deletions bigint,
    changed_files bigint,
    push_size bigint,
    push_distinct_size bigint,
    hr text,
    month text,
    year text,
    ds text
);
CALL set_table_property('public.gh_event_data', 'distribution_key', 'id');
CALL set_table_property('public.gh_event_data', 'event_time_column', 'created_at');
CALL set_table_property('public.gh_event_data', 'clustering_key', 'created_at');
COMMIT;

导入示例数据

外部表创立胜利后,能够通过以下步骤将数据导入 Hologres 外部表中。内部表在 Hologres 中不存储数据,只进行字段映射。通过内部表您能够应用 Hologres 间接调用存储于 MaxCompute 公共空间 MAXCOMPUTE_PUBLIC_DATA 的数据。

  1. SQL 编辑器 页面,单击左上角的图标。
  2. 导入 TPC- H 数据集数据。
    在新增的 长期 Query 查问 页面,抉择已创立的 实例名 数据库 后,请您在 SQL 查问的编辑框输出示例代码,单击 运行
    示例 SQL 语句将 MaxCompute 公共空间 MAXCOMPUTE_PUBLIC_DATA 中 public.odps_customer_10g、public.odps_lineitem_10g 等表中数据导入到对应名称的外部表中,用于后续查问。
INSERT INTO public.customer SELECT * FROM public.odps_customer_10g ;
INSERT INTO public.lineitem SELECT * FROM public.odps_lineitem_10g ;
INSERT INTO public.nation SELECT * FROM public.odps_nation_10g ;
INSERT INTO public.orders SELECT * FROM public.odps_orders_10g ;
INSERT INTO public.part SELECT * FROM public.odps_part_10g ;
INSERT INTO public.partsupp SELECT * FROM public.odps_partsupp_10g ;
INSERT INTO public.region SELECT * FROM public.odps_region_10g ;
INSERT INTO public.supplier SELECT * FROM public.odps_supplier_10g ;
vacuum nation;
vacuum region;
vacuum supplier;
vacuum customer;
vacuum part;
vacuum partsupp;
vacuum orders;
vacuum lineitem;
analyze nation;
analyze region;
analyze lineitem;
analyze orders;
analyze customer;
analyze part;
analyze partsupp;
analyze supplier;
analyze lineitem (l_orderkey,l_partkey,l_suppkey);
analyze orders (o_custkey);
analyze partsupp(ps_partkey,ps_suppkey);
  1. 导入 GitHub 公开事件数据。
    单击左上角的图标,在新增的 长期 Query 查问 页面,抉择已创立的 实例名 数据库 后,请您在 SQL 查问的编辑框输出示例代码,单击 运行
    示例 SQL 语句将 MaxCompute 公共空间 MAXCOMPUTE_PUBLIC_DATA 中的表 dwd_github_events_odps 中前一日的数据导入到外部表中,用于后续查问。因为本次流动中 Hologres 的资源无限,建议您导入并查问少于 15 天的数据。
INSERT INTO gh_event_data
SELECT
    *
FROM
    dwd_github_events_odps
WHERE
    ds >= (CURRENT_DATE - interval '1 day')::text;
analyze gh_event_data;

查问表中数据

  1. SQL 编辑器 页面,单击左上角的图标。
  2. 基于 TPC- H 数据集数据查问。
    在新增的 长期 Query 查问 页面,抉择已创立的 实例名 数据库 后,请您在 SQL 查问的编辑框输出示例代码,单击 运行
    下述 SQL 代码均为查问外部表数据应用,如需查问内部表,请将对应代码查问的表名更换为内部表名。
    基于 TPC- H 演变的 22 条查问语句请参见查问表中数据。
select
        l_returnflag,
        l_linestatus,
        sum(l_quantity) as sum_qty,
        sum(l_extendedprice) as sum_base_price,
        sum(l_extendedprice * (1 - l_discount)) as sum_disc_price,
        sum(l_extendedprice * (1 - l_discount) * (1 + l_tax)) as sum_charge,
        avg(l_quantity) as avg_qty,
        avg(l_extendedprice) as avg_price,
        avg(l_discount) as avg_disc,
        count(*) as count_order
from
        lineitem
where
        l_shipdate <= date '1998-12-01' - interval '120' day
group by
        l_returnflag,
        l_linestatus
order by
        l_returnflag,
        l_linestatus;
  1. 基于 GitHub 公开事件数据查问。单击左上角的图标,在新增的 长期 Query 查问 页面,抉择已创立的 实例名 数据库 后,请您在 SQL 查问的编辑框输出示例代码,单击 运行。本文给出一些简略的数据分析语句,您能够基于表中字段,自行设计其余剖析语句并查问。下述 SQL 代码均为查问外部表数据应用,如需查问内部表,请将对应代码查问的表名更换为内部表名。
    • 查问昨日最沉闷我的项目。
SELECT
    repo_name,
    COUNT(*) AS events
FROM
    gh_event_data
WHERE
    created_at >= CURRENT_DATE - interval '1 day'
GROUP BY
    repo_name
ORDER BY
    events DESC
LIMIT 5;
    • 查问昨日最沉闷开发者。
SELECT
    actor_login,
    COUNT(*) AS events
FROM
    gh_event_data
WHERE
    created_at >= CURRENT_DATE - interval '1 day'
    AND actor_login NOT LIKE '%[bot]'
GROUP BY
    actor_login
ORDER BY
    events DESC
LIMIT 5;
    • 查问昨日编程语言排行。
SELECT
    language,
    count(*) total
FROM
    gh_event_data
WHERE
    created_at > CURRENT_DATE - interval '1 day'
    AND language IS NOT NULL
GROUP BY
    language
ORDER BY
    total DESC
LIMIT 10;
    • 查问昨日我的项目新增星标数排行(不思考勾销星标的场景)。
SELECT
    repo_id,
    repo_name,
    COUNT(actor_login) total
FROM
    gh_event_data
WHERE
    type = 'WatchEvent'
    AND created_at > CURRENT_DATE - interval '1 day'
GROUP BY
    repo_id,
    repo_name
ORDER BY
    total DESC
LIMIT 10;

实现

实现以上操作后,您曾经胜利实现了 Hologres 数据查问操作。查问命令执行胜利后,在 长期 Query 查问 页面下弹出 后果 页签,显示如下查问数据后果。

  • 基于 TPC- H 数据集数据查问后果示例:
  • 基于 GitHub 公开事件数据查问后果示例:
    • 昨日最沉闷我的项目:
    • 昨日最沉闷开发者:
    • 昨日编程语言排行:
    • 昨日我的项目新增星标数排行:
  • Hologres 5000CU 时,20GB 存储收费试用, 返回试用 >>
  • 理解 Hologres: https://www.aliyun.com/product/bigdata/hologram

    欢送关注 Hologres 开发者社区

退出移动版