Transferencia de datos entre buckets de OBS y clústeres de DWS
Esta guía muestra cómo cargar datos de ejemplo en OBS y acceder a ellos a través de una tabla foránea de OBS. Puede importar datos de OBS a DWS o exportar datos de DWS a OBS.
- Los datos se pueden importar a OBS en formatos TXT, CSV, ORC, PARQUET, CARBONDATA o JSON.
- Los datos se pueden exportar de OBS en los siguientes formatos:
- ORC, CARBONDATA, and PARQUET: Deberá crear un servidor foráneo. Para saber cómo crear un servidor foráneo, consulte Paso 2: Crear un servidor foráneo y una tabla foránea de OBS. Este ejemplo exporta datos de este tipo.
- TXT and CSV: No se requiere un servidor foráneo, ya que el sistema proporciona el servidor gsmpp_server de forma predeterminada. Para saber cómo exportar datos en este formato, consulte Exportación de datos CSV/TXT a OBS.
OBS es un servicio de almacenamiento basado en objetos que ofrece almacenamiento de datos seguro, confiable y rentable para diversos usuarios, sitios web, empresas y desarrolladores. Puede utilizar la consola de OBS o el navegador de OBS para acceder y gestionar los datos almacenados en OBS desde cualquier computadora conectada a Internet. Para obtener más información, consulte Documentación de Object Storage Service.
Esta práctica toma aproximadamente 1 hora. El procedimiento básico es el siguiente:
- Preparativos: Cree un clúster de DWS y un bucket de OBS, y obtenga la AK y la SK.
- Paso 1: Preparar datos de OBS: Cargue los datos de muestra preestablecidos en el bucket de OBS.
- Paso 2: Crear un servidor foráneo y una tabla foránea de OBS: Prepárese para importar datos desde el bucket de OBS.
- Paso 3: Acceder e importar datos de bucket de OBS a un clúster de DWS: Importe datos mediante una tabla foránea de OBS.
- Paso 4: Exportar datos de una tabla de DWS a un bucket de OBS: Verifique que los datos no se puedan actualizar ni eliminar en una tabla foránea de solo escritura después de la exportación de datos.
Preparativos
- Cree un clúster de DWS. Para obtener más información, consulte Creación de un clúster de DWS dedicado
- Cree un bucket de OBS en la misma región que DWS. Puede nombrar el bucket obs-demo01. Si 01 está ocupado, utilice obs-demo02. Siga este patrón. Para obtener más información, consulte la documentación de Object Storage Service.
- Obtenga la AK y la SK de la cuenta para acceder a los datos en el bucket de OBS. Para obtener más información, consulte Claves de acceso
Paso 1: Preparar datos de OBS
- Descargue el archivo de muestra de datos.
- Inicie sesión en la consola de OBS y haga clic en el bucket obs-demo01 en la lista de buckets.
- Seleccione Objects a la izquierda, haga clic en Create Folder y nombre la carpeta obs-dws.
- Vaya a la carpeta obs-dws, haga clic en Upload Object y cargue el archivo de muestra descargado en 1 en la carpeta obs-dws.
- Obtenga el punto de conexión de OBS.
- Vuelva a la página obs-dws y haga clic en Overview a la izquierda.
- Registre el punto de conexión de la lista Domain Name Details, por ejemplo, obs.ap-southeast-1.myhuaweicloud.com.
Paso 2: Crear un servidor foráneo y una tabla foránea de OBS
Un servidor foráneo es un enlace virtual que ayuda a organizar y controlar fuentes de datos externas, como bases de datos y sistemas de archivos, en un sistema de bases de datos o almacén de datos. Permite el acceso unificado a diversos datos distribuidos y desempeña un papel clave en la integración de datos, el análisis en tiempo real y la virtualización de datos.
Para acceder a los datos de bucket de OBS a través de un servidor foráneo, configure un servidor foráneo de OBS y proporcione el punto de conexión, la clave de acceso (AK) y la clave secreta (SK) para OBS.
- Ejecute la siguiente sentencia SQL para crear un servidor foráneo después de conectarse a la base de datos. Establezca ADDRESS en la dirección obtenida en 5 y establezca ACCESS_KEY y SECRET_ACCESS_KEY en la AK y SK obtenidas en Preparativos.
1 2 3 4 5 6 7
CREATE SERVER obs_server FOREIGN DATA WRAPPER DFS_FDW OPTIONS ( ADDRESS 'obs.aaaaa.bbbbb.com', ACCESS_KEY 'xxxxxxxxx', SECRET_ACCESS_KEY 'yyyyyyyyyyyyy', TYPE 'OBS' );
- Ejecute la siguiente sentencia SQL para crear un esquema denominado dws_data:
1CREATE SCHEMA dws_data;
- Cambie al esquema recién creado y cree una tabla foránea.
Reemplace '/obs-demo01/obs-dws/' con su ruta de OBS real donde se almacenan los archivos de datos. Asegúrese de que el bucket de OBS y el clúster de DWS estén en la misma región. En este ejemplo, la ruta de OBS es la carpeta obs-dws en el bucket obs-demo01.
SERVER obs_server indica el nombre del servidor foráneo creado en 1, por ejemplo, obs_server.1 2 3 4 5 6 7 8 9 10 11 12 13 14
CREATE FOREIGN TABLE dws_data.obs_pq_order ( order_id VARCHAR(14) PRIMARY KEY NOT ENFORCED, order_channel VARCHAR(32), order_time TIMESTAMP, cust_code VARCHAR(6), pay_amount DOUBLE PRECISION, real_pay DOUBLE PRECISION ) SERVER obs_server OPTIONS ( foldername '/obs-demo01/obs-dws/', format 'parquet', encoding 'utf8' ) READ ONLY DISTRIBUTE BY roundrobin;
Paso 3: Acceder e importar datos de bucket de OBS a un clúster de DWS
- Utilice la tabla foránea creada en los pasos anteriores para acceder directamente a los datos del bucket de OBS.
1SELECT * FROM dws_data.obs_pq_order;
- Ejecute la sentencia SELECT con condiciones a través de una tabla foránea.
1 2 3 4 5 6 7 8 9
SELECT COUNT(*) FROM dws_data.obs_pq_order; SELECT order_id, order_channel, order_time, cust_code FROM dws_data.obs_pq_order; SELECT TO_CHAR(order_time, 'Month, YYYY') AS order_month, cust_code, COUNT(*) AS order_cnt FROM dws_data.obs_pq_order WHERE DATE_PART('Year', order_time) = 2023 GROUP BY TO_CHAR(order_time, 'Month, YYYY'), cust_code HAVING COUNT(*) >= 10;
- Cree una tabla local para importar datos a un clúster de DWS a través de una tabla foránea de OBS.
1 2 3 4 5 6
CREATE TABLE dws_data.dws_monthly_order ( order_month CHAR(8), cust_code VARCHAR(6), order_count INT, total_pay_amount DOUBLE PRECISION, total_real_pay DOUBLE PRECISION );
- Utilice los datos de la tabla foránea de OBS para calcular los detalles de los pedidos mensuales de 2023 e importe el resultado a la tabla local del clúster de DWS.
1 2 3 4 5 6 7 8
INSERT INTO dws_data.dws_monthly_order ( order_month, cust_code, order_count , total_pay_amount, total_real_pay ) SELECT TO_CHAR(order_time, 'MON-YYYY'), cust_code, COUNT(*) , SUM(pay_amount), SUM(real_pay) FROM dws_data.obs_pq_order WHERE DATE_PART('Year', order_time) = 2023 GROUP BY TO_CHAR(order_time, 'MON-YYYY'), cust_code;
- Verifique el estado de importación de los datos de la tabla.
1SELECT * FROM dws_data.dws_monthly_order;
Paso 4: Exportar datos de una tabla de DWS a un bucket de OBS
- Cree una tabla local.
1 2 3 4 5 6 7
CREATE TABLE dws_data.dws_order ( order_id VARCHAR(14) PRIMARY KEY, order_channel VARCHAR(32), order_time TIMESTAMP, cust_code VARCHAR(6), pay_amount DOUBLE PRECISION, real_pay DOUBLE PRECISION );
- Inserte tres registros de datos.
1 2 3 4
INSERT INTO dws_data.dws_order VALUES ('20230627000001', 'webShop', TIMESTAMP '2023-06-27 10:00:00', 'CUST1', 1000, 1000) , ('20230627000002', 'webShop', TIMESTAMP '2023-06-27 11:00:00', 'CUST2', 5000, 5000) , ('20240309000003', 'webShop', TIMESTAMP '2024-03-09 13:00:00', 'CUST1', 2000, 2000);
- Cree una tabla foránea para exportar datos a un bucket de OBS. Reemplace '/obs-demo01/obs-dws/' con su bucket de OBS ruta real.
1 2 3 4 5 6 7 8 9 10 11 12 13 14
CREATE FOREIGN TABLE dws_data.obs_orc_order ( order_id VARCHAR(14) PRIMARY KEY NOT ENFORCED, order_channel VARCHAR(32), order_time TIMESTAMP, cust_code VARCHAR(6), pay_amount DOUBLE PRECISION, real_pay DOUBLE PRECISION ) SERVER obs_server OPTIONS ( foldername '/obs-demo01/obs-dws/', format 'ORC', encoding 'utf8' ) READ WRITE DISTRIBUTE BY roundrobin;
- Escriba los datos de la tabla local en la tabla foránea de OBS.
1 2 3
INSERT INTO dws_data.obs_orc_order ( order_id, order_channel, order_time, cust_code, pay_amount, real_pay ) SELECT order_id, order_channel, order_time, cust_code, pay_amount, real_pay FROM dws_data.dws_order;
- Consulte si la importación de datos se realizó correctamente.
1SELECT * FROM dws_data.obs_orc_order;
- Inicie sesión en la consola de OBS para verificar si hay archivos de datos en el bucket de OBS.
- Verifique si se pueden insertar datos adicionales en la misma tabla foránea.
1 2 3
INSERT INTO dws_data.obs_orc_order ( order_id, order_channel, order_time, cust_code, pay_amount, real_pay ) SELECT order_id, order_channel, order_time, cust_code, pay_amount, real_pay FROM dws_data.dws_order;
Aparece el error "the file ruta specified in the foreign table is not empty". Si elimina el archivo de datos en la ruta de archivos de OBS, puede insertar datos nuevamente.
- Verifique si los datos de la tabla foránea se pueden actualizar y eliminar.
1 2
UPDATE dws_data.obs_orc_order SET pay_amount = 3000, real_pay = 3000 WHERE order_id = '20240309000003'; DELETE FROM dws_data.obs_orc_order WHERE order_id = '20240309000003';
Según la salida del comando, los datos de la tabla foránea no se pueden actualizar ni eliminar.