Estos contenidos se han traducido de forma automática para su comodidad, pero Huawei Cloud no garantiza la exactitud de estos. Para consultar los contenidos originales, acceda a la versión en inglés.
Centro de ayuda/ Data Warehouse Service/ Prácticas recomendadas / Análisis de datos/ Uso de DWS para analizar los requisitos de la cadena de suministro de una empresa
Actualización más reciente 2026-09-29 GMT+08:00

Uso de DWS para analizar los requisitos de la cadena de suministro de una empresa

Esta práctica describe cómo cargar el conjunto de datos de ejemplo de OBS a un clúster de almacén de datos y realizar consultas de datos. Este ejemplo comprende análisis de múltiples tablas y análisis de temas en el escenario de análisis de datos.

En este ejemplo, se ha generado un conjunto de datos estándar TPC-H-1x de 1 GB en DWS y se ha cargado en la carpeta tpch de un bucket de OBS. A todas las cuentas de Huawei Cloud se les ha otorgado el permiso de solo lectura para acceder al bucket de OBS. Los usuarios pueden importar fácilmente el conjunto de datos usando sus cuentas.

Procedimiento general

Esta práctica dura unos 60 minutos. El proceso es el siguiente:

  1. Hacer preparaciones
  2. Paso 1: Importación de datos de muestra
  3. Paso 2: Realización de análisis de múltiples tablas y análisis de temas

Regiones admitidas

La Tabla 1 describe las regiones donde se han cargado los datos de OBS.

Tabla 1 Regiones y nombres de bucket de OBS

Región

Bucket de OBS

CN North-Beijing1

dws-demo-cn-north-1

CN North-Beijing2

dws-demo-cn-north-2

CN North-Beijing4

dws-demo-cn-north-4

CN North-Ulanqab1

dws-demo-cn-north-9

CN East-Shanghai1

dws-demo-cn-east-3

CN East-Shanghai2

dws-demo-cn-east-2

CN South-Guangzhou

dws-demo-cn-south-1

CN South-Guangzhou-InvitationOnly

dws-demo-cn-south-4

CN-Hong Kong

dws-demo-ap-southeast-1

AP-Singapore

dws-demo-ap-southeast-3

AP-Bangkok

dws-demo-ap-southeast-2

LA-Santiago

dws-demo-la-south-2

AF-Johannesburg

dws-demo-af-south-1

LA-Mexico City1

dws-demo-na-mexico-1

LA-Mexico City2

dws-demo-la-north-2

RU-Moscow2

dws-demo-ru-northwest-2

LA-Sao Paulo1

dws-demo-sa-brazil-1

Descripción del escenario

Comprender las funciones básicas de DWS y cómo importar datos. Analice los datos de pedidos de una empresa y sus proveedores de la siguiente manera:

  1. Analice los ingresos aportados por los proveedores de una región a la empresa. Las estadísticas se pueden usar para determinar si es necesario establecer un centro de asignación local en una región dada.
  2. Analice la relación entre piezas y proveedores para obtener el número de proveedores por pieza en función de las condiciones de contribución especificadas. La información se puede utilizar para determinar si los proveedores son suficientes para grandes cantidades de pedidos cuando la tarea es urgente.
  3. Analice la pérdida de ingresos de los pedidos pequeños. Puede consultar la pérdida de ingresos promedio anual si no hay pedidos pequeños. Filtre los pedidos pequeños que son inferiores al 20 % del volumen de suministro promedio y calcule el monto total de esos pedidos pequeños para calcular la pérdida de ingresos promedio anual.
  4. En esta práctica, los datos de muestra de TPC-H constan de ocho tablas de base de datos cuyas asociaciones se muestran en la Figura 1.
    Figura 1 Tablas de datos de TPC-H

Hacer preparaciones

Paso 1: Importación de datos de muestra

Después de conectarse al clúster mediante la herramienta cliente SQL, realice las siguientes operaciones en la herramienta cliente SQL para importar los datos de muestra de TPC-H y realizar consultas de datos.

  1. En la puesta en marcha del servicio, se recomienda utilizar el SQL Editor para conectarse al clúster. Para obtener más información, consulte Uso del SQL Editor para conectarse a un clúster.

    También puede utilizar otros métodos (como la herramienta de línea de comandos gsql) para conectarse al clúster. Para obtener más información, consulte Conexión a un clúster de DWS.

  2. Ejecute la siguiente sentencia en la ventana de edición para crear una tabla:

      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
     83
     84
     85
     86
     87
     88
     89
     90
     91
     92
     93
     94
     95
     96
     97
     98
     99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    DROP TABLE if exists region;
    CREATE TABLE region
    (
            R_REGIONKEY  INT NOT NULL , 
            R_NAME       CHAR(25) NOT NULL ,
            R_COMMENT    VARCHAR(152)
    )
    with (orientation = column, COMPRESSION=MIDDLE)
    distribute by replication;
    
    DROP TABLE if exists nation;
    CREATE TABLE nation
    (
            N_NATIONKEY  INT NOT NULL, 
            N_NAME       CHAR(25) NOT NULL,
            N_REGIONKEY  INT NOT NULL,
            N_COMMENT    VARCHAR(152)
    )
    with (orientation = column,COMPRESSION=MIDDLE)
    distribute by replication;
    
    DROP TABLE if exists supplier;
    CREATE TABLE supplier
    (
            S_SUPPKEY     BIGINT NOT NULL,
            S_NAME        CHAR(25) NOT NULL,
            S_ADDRESS     VARCHAR(40) NOT NULL,
            S_NATIONKEY   INT NOT NULL,
            S_PHONE       CHAR(15) NOT NULL,
            S_ACCTBAL     DECIMAL(15,2) NOT NULL,
            S_COMMENT     VARCHAR(101) NOT NULL
    )
    with (orientation = column,COMPRESSION=MIDDLE)
    distribute by hash(S_SUPPKEY);
    
    DROP TABLE if exists customer;
    CREATE TABLE customer
    (
            C_CUSTKEY     BIGINT NOT NULL,
            C_NAME        VARCHAR(25) NOT NULL,
            C_ADDRESS     VARCHAR(40) NOT NULL, 
            C_NATIONKEY   INT NOT NULL, 
            C_PHONE       CHAR(15) NOT NULL, 
            C_ACCTBAL     DECIMAL(15,2)   NOT NULL,
            C_MKTSEGMENT  CHAR(10) NOT NULL, 
            C_COMMENT     VARCHAR(117) NOT NULL
    )
    with (orientation = column,COMPRESSION=MIDDLE)
    distribute by hash(C_CUSTKEY);
    
    DROP TABLE if exists part;
    CREATE TABLE part
    (
            P_PARTKEY     BIGINT NOT NULL, 
            P_NAME        VARCHAR(55) NOT NULL, 
            P_MFGR        CHAR(25) NOT NULL, 
            P_BRAND       CHAR(10) NOT NULL, 
            P_TYPE        VARCHAR(25) NOT NULL,
            P_SIZE        BIGINT NOT NULL,
            P_CONTAINER   CHAR(10) NOT NULL,
            P_RETAILPRICE DECIMAL(15,2) NOT NULL,
            P_COMMENT     VARCHAR(23) NOT NULL
    )
    with (orientation = column,COMPRESSION=MIDDLE)
    distribute by hash(P_PARTKEY);
    
    DROP TABLE if exists partsupp;
    CREATE TABLE partsupp
    (
            PS_PARTKEY     BIGINT NOT NULL,
            PS_SUPPKEY     BIGINT NOT NULL, 
            PS_AVAILQTY    BIGINT NOT NULL,
            PS_SUPPLYCOST  DECIMAL(15,2)  NOT NULL, 
            PS_COMMENT     VARCHAR(199) NOT NULL
    )
    with (orientation = column,COMPRESSION=MIDDLE)
    distribute by hash(PS_PARTKEY);
    
    DROP TABLE if exists orders;
    CREATE TABLE orders
    (
            O_ORDERKEY       BIGINT NOT NULL,
            O_CUSTKEY        BIGINT NOT NULL, 
            O_ORDERSTATUS    CHAR(1) NOT NULL, 
            O_TOTALPRICE     DECIMAL(15,2) NOT NULL,
            O_ORDERDATE      DATE NOT NULL , 
            O_ORDERPRIORITY  CHAR(15) NOT NULL, 
            O_CLERK          CHAR(15) NOT NULL , 
            O_SHIPPRIORITY   BIGINT NOT NULL,
            O_COMMENT        VARCHAR(79) NOT NULL
    )
    with (orientation = column,COMPRESSION=MIDDLE)
    distribute by hash(O_ORDERKEY);
    
    DROP TABLE if exists lineitem;
    CREATE TABLE lineitem
    (
            L_ORDERKEY    BIGINT NOT NULL,
            L_PARTKEY     BIGINT NOT NULL, 
            L_SUPPKEY     BIGINT NOT NULL,
            L_LINENUMBER  BIGINT 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  CHAR(1) NOT NULL,
            L_LINESTATUS  CHAR(1) NOT NULL,
            L_SHIPDATE    DATE NOT NULL, 
            L_COMMITDATE  DATE NOT NULL ,
            L_RECEIPTDATE DATE NOT NULL, 
            L_SHIPINSTRUCT CHAR(25) NOT NULL, 
            L_SHIPMODE     CHAR(10) NOT NULL, 
            L_COMMENT      VARCHAR(44) NOT NULL
    )
    with (orientation = column,COMPRESSION=MIDDLE)
    distribute by hash(L_ORDERKEY);
    

  3. Cree una tabla externa, que se utiliza para identificar y asociar los datos de origen en OBS.

    • <obs_bucket_name> indica el nombre del bucket de OBS correspondiente a la región donde se encuentra DWS. Para obtener más información sobre las regiones admitidas, consulte Regiones admitidas. El bucket de OBS y los datos de ejemplo se han preestablecido en el sistema y no es necesario crearlos. En este manual, se utiliza la región CN-Hong Kong y se establece <obs_bucket_name> en dws-demo-ap-southeast-1. No se puede acceder a los datos de bucket de OBS entre regiones. Por ejemplo, si el clúster se encuentra en CN-Hong Kong, no puede establecer <obs_bucket_name> en el nombre de bucket de otra región.
    • Reemplace <Access_Key_Id> y <Secret_Access_Key> con los valores reales obtenidos en Hacer preparaciones.
    • El uso de AK y SK codificadas de forma rígida (hard-coded) o en texto plano representa un riesgo de seguridad. Por seguridad, encripte su AK/SK y guárdelas en el archivo de configuración o en las variables de entorno.
      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
     83
     84
     85
     86
     87
     88
     89
     90
     91
     92
     93
     94
     95
     96
     97
     98
     99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    DROP FOREIGN table if exists region_ft;
    CREATE FOREIGN TABLE region_ft
    (
            like region
    )                    
    SERVER gsmpp_server 
    OPTIONS (
            encoding 'utf8',
            location 'obs://<obs_bucket_name>/tpch/region.tbl',
            format 'text',
            delimiter '|',
            access_key '<Access_Key_Id>',
            secret_access_key '<Secret_Access_Key>',
            chunksize '64',
            IGNORE_EXTRA_DATA 'on'
    );
    DROP FOREIGN table if exists nation_ft;
    CREATE FOREIGN TABLE nation_ft
    (
            like nation
    )
    SERVER gsmpp_server 
    OPTIONS (
             encoding 'utf8',
             location 'obs://<obs_bucket_name>/tpch/nation.tbl',
             format 'text',
             delimiter '|',
             access_key '<Access_Key_Id>',
             secret_access_key '<Secret_Access_Key>',
             chunksize '64',
             IGNORE_EXTRA_DATA 'on'
    );
    DROP FOREIGN table if exists supplier_ft;
    CREATE FOREIGN TABLE supplier_ft
    (
            like supplier
    )
    SERVER gsmpp_server 
    OPTIONS (
            encoding 'utf8',
            location 'obs://<obs_bucket_name>/tpch/supplier.tbl',
            format 'text',
            delimiter '|',
            access_key '<Access_Key_Id>',
            secret_access_key '<Secret_Access_Key>',
            chunksize '64',
            IGNORE_EXTRA_DATA 'on'
    );
    DROP FOREIGN table if exists customer_ft;
    CREATE FOREIGN TABLE customer_ft
    (
            like customer
    )
    SERVER gsmpp_server 
    OPTIONS (
            encoding 'utf8',
            location 'obs://<obs_bucket_name>/tpch/customer.tbl',
            format 'text',
            delimiter '|',
            access_key '<Access_Key_Id>',
            secret_access_key '<Secret_Access_Key>',
            chunksize '64',
            IGNORE_EXTRA_DATA 'on'
    );
    DROP FOREIGN table if exists part_ft;
    CREATE FOREIGN TABLE part_ft
    (
            like part
    
    )
    SERVER gsmpp_server 
    OPTIONS (
            encoding 'utf8',
            location 'obs://<obs_bucket_name>/tpch/part.tbl',
            format 'text',
            delimiter '|',
            access_key '<Access_Key_Id>',
            secret_access_key '<Secret_Access_Key>',
            chunksize '64',
            IGNORE_EXTRA_DATA 'on'
    );
    DROP FOREIGN table if exists partsupp_ft;
    CREATE FOREIGN TABLE partsupp_ft
    (
            like partsupp
    )
    SERVER gsmpp_server 
    OPTIONS (
            encoding 'utf8',
            location 'obs://<obs_bucket_name>/tpch/partsupp.tbl',
            format 'text',
            delimiter '|',
            access_key '<Access_Key_Id>',
            secret_access_key '<Secret_Access_Key>',
            chunksize '64',
            IGNORE_EXTRA_DATA 'on'
    );
    DROP FOREIGN table if exists orders_ft;
    CREATE FOREIGN TABLE orders_ft
    (
            like orders
    )
    SERVER gsmpp_server 
    OPTIONS (
            encoding 'utf8',
            location 'obs://<obs_bucket_name>/tpch/orders.tbl',
            format 'text',
            delimiter '|',
            access_key '<Access_Key_Id>',
            secret_access_key '<Secret_Access_Key>',
            chunksize '64',
            IGNORE_EXTRA_DATA 'on'
    );
    DROP FOREIGN table if exists lineitem_ft;
    CREATE FOREIGN TABLE lineitem_ft
    (
            like lineitem
    )
    SERVER gsmpp_server 
    OPTIONS (
            encoding 'utf8',
            location 'obs://<obs_bucket_name>/tpch/lineitem.tbl',
            format 'text',
            delimiter '|',
            access_key '<Access_Key_Id>',
            secret_access_key '<Secret_Access_Key>',
            chunksize '64',
            IGNORE_EXTRA_DATA 'on'
    );
    

  4. Copie y ejecute las siguientes sentencias para importar los datos de la tabla externa a la tabla de base de datos correspondiente.

    Ejecute el comando insert para importar los datos de la tabla externa de OBS a la tabla de base de datos de DWS. El núcleo de la base de datos importa simultáneamente los datos de OBS a alta velocidad a DWS.

    1
    2
    3
    4
    5
    6
    7
    8
    INSERT INTO lineitem SELECT * FROM lineitem_ft;
    INSERT INTO part SELECT * FROM part_ft;
    INSERT INTO partsupp SELECT * FROM partsupp_ft;
    INSERT INTO customer SELECT * FROM customer_ft;
    INSERT INTO supplier SELECT * FROM supplier_ft;
    INSERT INTO nation SELECT * FROM nation_ft;
    INSERT INTO region SELECT * FROM region_ft;
    INSERT INTO orders SELECT * FROM orders_ft;
    

    Se tarda 10 minutos en importar datos.

Paso 2: Realización de análisis de múltiples tablas y análisis de temas

A continuación se utiliza la consulta TPC-H estándar como ejemplo para demostrar cómo realizar una consulta de datos básica en DWS.

Antes de consultar datos, ejecute el comando Analyze para generar estadísticas relacionadas con la tabla de la base de datos. Los datos estadísticos se almacenan en la tabla del sistema PG_STATISTIC y son útiles cuando se ejecuta el planificador, que le proporciona un plan de ejecución de consultas eficiente.

A continuación se muestran ejemplos de consultas:

  • Consulta de ingresos de un proveedor en una región (TPCH-Q5)

    Al ejecutar la sentencia de consulta TPCH-Q5, puede consultar las estadísticas de ingresos de un proveedor de piezas de repuesto en una región. Los ingresos se calculan en función de sum(l_extendedprice * (1 - l_discount)). Las estadísticas se pueden usar para determinar si es necesario establecer un centro de asignación local en una región dada.

    Copie y ejecute la siguiente sentencia TPCH-Q5 para la consulta. Esta sentencia presenta una consulta de unión de múltiples tablas con GROUP BY, ORDER BY y AGGREGATE.

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    SELECT
    n_name,
    sum(l_extendedprice * (1 - l_discount)) as revenue
    FROM
    customer,
    orders,
    lineitem,
    supplier,
    nation,
    region
    where
    c_custkey = o_custkey
    and l_orderkey = o_orderkey
    and l_suppkey = s_suppkey
    and c_nationkey = s_nationkey
    and s_nationkey = n_nationkey
    and n_regionkey = r_regionkey
    and r_name = 'ASIA'
    and o_orderdate >= '1994-01-01'::date
    and o_orderdate < '1994-01-01'::date + interval '1 year'
    group by
    n_name
    order by
    revenue desc;
    
  • Consulta de relaciones entre repuestos y proveedores (TPCH-Q16)

    Al ejecutar la sentencia de consulta TPCH-Q16, puede obtener el número de proveedores que pueden suministrar piezas de repuesto con las condiciones de contribución especificadas. Esta información se puede utilizar para determinar si hay suficientes proveedores cuando la cantidad de pedido es grande y la tarea es urgente.

    Copie y ejecute la siguiente sentencia TPCH-Q16 para la consulta. La sentencia cuenta con operaciones de unión de múltiples tablas con subconsultas de agrupación (GROUP BY), ordenamiento (SORT BY), agregación, deduplicación y subconsultas NOT IN

     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
    SELECT
    p_brand,
    p_type,
    p_size,
    count(distinct ps_suppkey) as supplier_cnt
    FROM
    partsupp,
    part
    where
    p_partkey = ps_partkey
    and p_brand <> 'Brand#45'
    and p_type not like 'MEDIUM POLISHED%'
    and p_size in (49, 14, 23, 45, 19, 3, 36, 9)
    and ps_suppkey not in (
            select
            s_suppkey
            from
            supplier
            where
            s_comment like '%Customer%Complaints%'
    )
    group by
    p_brand,
    p_type,
    p_size
    order by
    supplier_cnt desc,
    p_brand,
    p_type,
    p_size
    limit 100;
    
  • Consulta de pérdidas de ingresos por pedidos pequeños (TPCH-Q17)

    Puede consultar la pérdida de ingresos promedio anual si no hay pedidos pequeños. Filtre los pedidos pequeños que son inferiores al 20 % del volumen de suministro promedio y calcule el monto total de esos pedidos pequeños para calcular la pérdida de ingresos promedio anual.

    Copie y ejecute la siguiente sentencia TPCH-Q17 para la consulta. La sentencia cuenta con operaciones de unión de múltiples tablas con agregación y subconsultas de agregación.

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    SELECT
    sum(l_extendedprice) / 7.0 as avg_yearly
    FROM
    lineitem,
    part
    where
    p_partkey = l_partkey
    and p_brand = 'Brand#23'
    and p_container = 'MED BOX'
    and l_quantity < (
            select 0.2 * avg(l_quantity)
            from lineitem
            where l_partkey = p_partkey
    );