Procházet zdrojové kódy

test(integration): 新增 hdfs_export 冒烟套件(PG 目标表 DDL + ini + README)

闭环:hive-import 把 PG 数据同步到 Hive raw,此套件把 Hive raw 回写 PG
目标表 test.ads_usr_app_user_cert_info_export 全字段 VARCHAR 简化
preSql TRUNCATE + writeMode insert 幂等(等同 replace 语义;PG 无原生 replace)
ini reader/writer 字段按 postgresql_writer / hdfs_reader 的 ConfigParser.get 强读契约补全

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
tianyu.chu před 1 týdnem
rodič
revize
bff1ecfbb1

+ 57 - 0
tests/integration/datax/hdfs_export/README.md

@@ -0,0 +1,57 @@
+# DataX hdfs-export 集成测试
+
+端到端验证 Hive `test.raw_usr_app_user_cert_info_inc_d`(dt=20260422 分区)→ PG `test.ads_usr_app_user_cert_info_export` 回写。
+
+闭环:先前 hive-import 冒烟把 PG `public.app_user_cert_info` 同步到 Hive raw 分区;本冒烟再把 Hive raw 分区数据回写到 PG 另一张表,验证 `datax-hdfs-export-starter` 端到端。
+
+## 前置条件
+
+- hive-import 冒烟已通过,Hive `test.raw_usr_app_user_cert_info_inc_d` 表 `dt=20260422` 分区里有数据
+- PG `dev-poyee-xiaoxu` 实例对 `hs_sync_data` 库 `test` schema 有**写权限**
+- 项目代码 + `datasource/` + `/opt/datax` 同步到 cdhmaster02 / cdhnode01-03
+- bigdata 用户、发布目录下执行(`-random` 生效所需)
+
+## 执行步骤
+
+1. 在 PG 执行 `ddl/pg_target.sql` 建目标表(含 `CREATE SCHEMA IF NOT EXISTS test` + 建表)
+2. 跑 DataX:
+
+    ```bash
+    bin/datax-hdfs-export-starter.sh \
+      -ini tests/integration/datax/hdfs_export/export_user_cert_info.ini \
+      -start-date 20260422 -stop-date 20260423 \
+      -random
+    ```
+
+    (start-date 用作 hdfsreader 的 `${dt}` 占位符替换,读 Hive 分区 `dt=20260422`)
+
+## 预期
+
+- PG `test.ads_usr_app_user_cert_info_export` 表被 `TRUNCATE` 后插入数据
+- 行数 = Hive `test.raw_usr_app_user_cert_info_inc_d` 的 `dt=20260422` 分区行数
+- `cert_birthday` 字段值形如 `"1990-05"`(Hive raw 层已脱敏到月)
+- 不存在 `user_cert_data` / `cert_no` / `cert_real_name` 三个敏感字段(原本就没同步进 Hive)
+
+## 验证 SQL
+
+PG 侧:
+
+```sql
+SELECT COUNT(*) FROM test.ads_usr_app_user_cert_info_export;
+SELECT id, user_id, cert_birthday, create_time
+FROM test.ads_usr_app_user_cert_info_export
+LIMIT 5;
+```
+
+Hive 侧对比:
+
+```sql
+SELECT COUNT(*) FROM test.raw_usr_app_user_cert_info_inc_d WHERE dt='20260422';
+```
+
+两边 COUNT 一致 = 冒烟通过。
+
+## 相关文件
+
+- `ddl/pg_target.sql`:PG 目标表建表 SQL
+- `export_user_cert_info.ini`:DataX ini

+ 25 - 0
tests/integration/datax/hdfs_export/ddl/pg_target.sql

@@ -0,0 +1,25 @@
+-- PG 目标表(DataX hdfs-export 冒烟用)
+--
+-- 链路:Hive test.raw_usr_app_user_cert_info_inc_d → PG test.ads_usr_app_user_cert_info_export
+-- 简化策略:全字段 VARCHAR,对齐 Hive raw 全字段 STRING 语义,避免 YYYY-MM 脱敏值解析为 timestamp 失败
+-- 幂等策略:DataX ini 用 preSql = TRUNCATE 清空目标表再 insert,每次冒烟都是全量覆盖
+
+CREATE SCHEMA IF NOT EXISTS test;
+
+DROP TABLE IF EXISTS test.ads_usr_app_user_cert_info_export;
+
+CREATE TABLE test.ads_usr_app_user_cert_info_export (
+    id            VARCHAR(64) PRIMARY KEY,
+    user_id       VARCHAR(64),
+    cert_birthday VARCHAR(32),
+    cert_sex      VARCHAR(32),
+    cert_province VARCHAR(255),
+    cert_city     VARCHAR(255),
+    version       VARCHAR(32),
+    status        VARCHAR(32),
+    del_flag      VARCHAR(32),
+    create_time   VARCHAR(64),
+    update_time   VARCHAR(64)
+);
+
+COMMENT ON TABLE test.ads_usr_app_user_cert_info_export IS '用户证件信息(DataX hdfs-export 冒烟目标表,Hive raw 回写 PG 闭环验证用)';

+ 30 - 0
tests/integration/datax/hdfs_export/export_user_cert_info.ini

@@ -0,0 +1,30 @@
+; DataX hdfs-export 冒烟:Hive test.raw_usr_app_user_cert_info_inc_d → PG test.ads_usr_app_user_cert_info_export
+;
+; 源 datasource:datasource/hdfs/prd-hdfs-ha.ini(Hive 表底层 HDFS)
+; 目标 datasource:datasource/postgresql/dev-poyee-xiaoxu.ini
+; 链路:闭环验证——raw 层 Hive 数据原样回写 PG,目标表全字段 VARCHAR 简化
+; 幂等:preSql TRUNCATE 清空目标表,每次冒烟全量覆盖
+;
+; 注:key = value 不对齐
+
+[reader]
+dataSource = hdfs/prd-hdfs-ha
+path = /user/hive/warehouse/test.db/raw_usr_app_user_cert_info_inc_d/dt=${dt}/
+column = id,user_id,cert_birthday,cert_sex,cert_province,cert_city,version,status,del_flag,create_time,update_time
+columnType =
+fileType = orc
+encoding = UTF-8
+compress =
+nullFormat =
+fieldDelimiter = \t
+
+[writer]
+dataSource = postgresql/dev-poyee-xiaoxu
+database = hs_sync_data
+table = test.ads_usr_app_user_cert_info_export
+column = id,user_id,cert_birthday,cert_sex,cert_province,cert_city,version,status,del_flag,create_time,update_time
+columnType =
+preSql = TRUNCATE TABLE test.ads_usr_app_user_cert_info_export
+postSql =
+writeMode = insert
+batchSize = 1024