乐趣区

关于云计算:数仓架构瘦身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. 勾选服务协定后,单击立刻试用,并依据页面提醒实现试用申请。
    单击返回控制台,开启试用体验。

创立数据库

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

  1. 登录 Hologres 治理控制台,单击左侧实例列表。
  2. 在实例列表页面,单击对应实例名称。
  3. 在实例详情页左侧导航栏,单击数据库治理。
  4. 在 DB 受权页面,单击右上角新增数据库。
  5. 在新增数据库对话框,配置如下参数。

创立表

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

1. 登录数据库。

a. 在 DB 受权页面的顶部菜单栏,单击元数据管理。

b. 在元数据管理页面,双击左侧目录树中已创立胜利的数据库名称,单击确认。

2. 新建内部表。

a. 在 SQL 编辑器页面,单击左上角的图标。

b. 新增应用 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');

c. 新增应用 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');

3. 新建外部表。

a. 在 SQL 编辑器页面,单击左上角的图标。

b. 新建应用 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;

c. 新增应用 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);

3. 导入 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;

3. 基于 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 查问页面下弹出后果页签,显示如下查问数据后果。

  1. 基于 TPC- H 数据集数据查问后果示例:
  1. 基于 GitHub 公开事件数据查问后果示例:
  • 昨日最沉闷我的项目:
  • 昨日最沉闷开发者:
  • 昨日编程语言排行:
  • 昨日我的项目新增星标数排行:

点击立刻收费试用云产品 开启云上实际之旅!

原文链接

本文为阿里云原创内容,未经容许不得转载。

退出移动版