Sfoglia il codice sorgente

build(deps): 加入 pyspark==2.4.0 解决 PyCharm 远程解释器索引缺失

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
tianyu.chu 2 settimane fa
parent
commit
4c55533b2f
3 ha cambiato i file con 4 aggiunte e 2 eliminazioni
  1. 2 2
      kb/90-重构路线.md
  2. 1 0
      kb/92-重构进度.md
  3. 1 0
      requirements.txt

+ 2 - 2
kb/90-重构路线.md

@@ -538,7 +538,7 @@ tests/
 
 | 分类 | 处理方式 | 代表包 |
 |---|---|---|
-| **强依赖(KEEP)** | 留在 `requirements.txt` | pandas / pymongo / PyMySQL / requests / PyYAML / findspark / python-dateutil / wheel / pytest |
+| **强依赖(KEEP)** | 留在 `requirements.txt` | pyspark / pandas / pymongo / PyMySQL / requests / PyYAML / findspark / python-dateutil / wheel / pytest |
 | **无引用(DROP)** | 直接移除 | openvino / transformers / scikit-learn / scipy / numpy / Flask / matplotlib / lxml / SQLAlchemy / jieba / cpca / openpyxl / xlrd / 等 20+ 个 |
 | **stdlib 冗余(STDLIB)** | 移除 backport | `configparser` —— Python 3 标准库自带,backport 安装反而会覆盖 stdlib |
 | **弱依赖(LAZY)** | **不写进 requirements**,用到时手动 pip install | elasticsearch / pyhive / redis / cryptography / oss2 / fuzzywuzzy / pygeohash / pypinyin —— 都只被即将清理的老业务代码引用 |
@@ -547,7 +547,7 @@ tests/
 
 - LAZY 类依赖关联的老代码:`get_oldmongo_*` / `mg2es/` / `ent_interface_dingtalk*` 于 2026-04-20 第一批提前清理;同日第二批清理 `dw_base/oss/` 整目录、`dw_base/scheduler/` 整目录(含 polling_scheduler / drop_partitions / drop_daily_full_snapshot_tbls)、`dw_base/hive/` 整目录、`dw_base/utils/` 7 文件(data_distinct / diff_utils / excel_to_hive_utils / hive_diff_database / hive_to_excel_utils / pdt_check_table\*);剩余 `customs/similarity.py` 等在阶段 4 / 阶段 5 一并清理
 - 不需要 `requirements-base.txt` / `requirements-dev.txt` 分文件——当前依赖规模下单文件已经足够
-- pyspark **不写进 `requirements.txt`**:靠 `findspark` 运行时定位 CDH 集群已装 PySpark(版本随集群,客户端无需、也不能固定)
+- pyspark==2.4.0 固定(对齐 CDH 6.3.2 parcel 自带版本):`pip install` 把 pyspark 装进解释器 site-packages 解决 PyCharm 远程解释器静态索引红线 + 本地 pytest;运行时 `findspark.init()` 指向集群 `$SPARK_HOME/python/`,两条链路同版本不冲突
 
 ### 7.2 日志改进
 

+ 1 - 0
kb/92-重构进度.md

@@ -158,6 +158,7 @@
 | 2026-04-20 | **§7.2.1 再次反转**:删除 `whoami == RELEASE_USER` 分流,`LOG_ROOT_DIR` 改为单值默认 `${HOME}/log` 并保留在 `conf/env.sh`(外配后期可改)。理由:`$HOME` 天然按用户隔离(bigdata/个人用户家目录不同),代码判断是多余一层;`bigdata` 本身就是专属调度账号,其 `$HOME` 即是生产日志合法归宿,不需要系统级 `/opt/data/log` 那条路。同步更新 `90-重构路线.md §7.2.1`(核心段)+ `§2.1 硬编码表行` + `§2.4 env.sh 草稿` + `00-项目架构.md §6 部署段` + `92 阶段 2 checklist` | — |
 | 2026-04-20 | **老业务耦合代码第二批清理(重构计划外)**:在 UDF/模块独立化讨论中顺带盘点 `dw_base/` 子模块,决定 16 文件批量删除:**整目录删 3 个**——`oss/`(oss2_util.py + __init__,新业务不需要对象存储)、`scheduler/`(polling_scheduler / drop_partitions / drop_daily_full_snapshot_tbls 三业务文件,前者绑死老 Mongo 轮询、后两者按 N 天清分区的能力已在阶段 4 记录重写任务)、`hive/`(hive_utils + hive_constants;hive_utils 中 `get_hive_create_table_ddl*` 零引用 + 依赖 `COLUMN_NAME_COMMENT_DICT` 老业务字段字典、DDL 生成器整体不重建;`get_hive_database_name` / `get_hive_table_prefix` 两个命名约定函数语义已在 `kb/21-命名规范.md` 有规则,不重建代码,后续 `bin/datax-gc-generator.py` 从零重写时按新约定实现);**utils/ 删 7 文件**——data_distinct / diff_utils / excel_to_hive_utils / hive_diff_database / hive_to_excel_utils / pdt_check_table / pdt_check_table_multis,全部零外部引用 + 强业务耦合(硬编码 tendata 路径 / 老集群 IP `192.168.30.3` / 中文表名拼音转换 / 海关 `cts_*` 表名模式)。**连带效应**:`bin/datax-gc-generator.py:26` import hive_utils 成破损 import,由 90-路线 §2.7 "从零重写" 任务覆盖,不单独修复。**阶段 4 新增任务**:重新实现分区保留工具(元表驱动 + 参数化天数,目录可能不叫 scheduler)。**CLAUDE.md 规则追加**:"空模块直接删"原则首次执行延后(elasticsearch/flink/ml/validation/common/ 暂留,后续更细粒度规整) | — |
 | 2026-04-20 | **老业务耦合代码批量清理(重构计划外)**:排查 `tendata` 残留时发现一批与 `tendata_corp` / `ent_tendata_interface` / DolphinScheduler / 钉钉告警强耦合的存量文件,逐项核对后批量删除 40 个文件 + 精简 1 个:**老业务模块 34**(`dw_base/scheduler/` 下 `get_oldmongo_*` ×5、`dingtalk_*` / `ent_interface_dingtalk*` / `country_count_dingtalk` / `mg_company_alias_init` ×8、`mg2es/` 整目录 13 文件;`dw_base/ds/` 整目录 4 文件;`dw_base/spark/udf/spark_read_hive_columns_cnt.py`;`dw_base/utils/tid_utils.py`;`dw_base/spark/td_spark_init.py`(老同事 xunxu 所写未被调用);`bin/hive-exec.sh`),**级联清理 6**(`dw_base/spark/udf/spark_id_generate_udf.py` + `dw_base/spark/udf/enterprise/unique/spark_tid_match_udf.py` 依赖已删 `tid_utils`;`dw_base/utils/hive_file_merge.py` + `dw_base/utils/spark_parse_json_to_hive.py` 依赖已删 `mg2es`/钉钉告警;`bin/hive-exec-job-starter.py` 调用已删 `hive-exec.sh`;`bin/dingtalk-work-alert.sh`),**精简 1**:`dw_base/spark/udf/spark_mmq_udf.py` 从 530 行裁到 4 个数据类型转换函数(phone/domain/website/statname 等场景相关 UDF 与 Mongo 相关逻辑全删)。同步更新:`00-项目架构.md`(移除 `td_spark_init` / DS 相关条目)、`90-重构路线.md`(钉钉 + 企微 Webhook 合并表述、删除 DS API 行、§5.2 依赖清理清单标记提前完成)、`92-进度.md` 阶段 1 第 6 行 `re.sub` checklist 更新残留范围(~15 处)。**阶段 4 新增两项任务**:(1) 重新实现 Hive HDFS 小文件合并工具(通用化连接 / 剥离 `cts_*_ex/_im` 表名假设);(2) 重写告警模块(弃钉钉走 `conf/alerter.ini` Webhook) | — |
+| 2026-04-20 | **pyspark 入 requirements.txt(反转 2026-04-15 "不写进" 决策)**:实际开发流程是 PyCharm SSH 到服务器用 bigdata 用户的 Python 解释器,该解释器 site-packages 只有 `findspark==2.0.1`,真正的 pyspark 在 CDH `$SPARK_HOME/python/` 下不被索引 → PyCharm 静态索引红线 + 本地 pytest 失败。解法:`pyspark==2.4.0` 入 `requirements.txt`(版本对齐 CDH 6.3.2 parcel 自带 Spark 2.4.0,见 `requirements.txt.bak:45` + `kb/01-运行环境.md:64`);运行时仍靠 `findspark.init()` 指向集群 `$SPARK_HOME/python/`,同版本双轨不冲突。同步 `kb/90-重构路线.md §7.1` KEEP 行放回 pyspark + 末句机制改写 | — |
 | 2026-04-20 | **UDF 提升为顶层模块(重构计划外)**:`dw_base/spark/udf/` → `dw_base/udf/`。动机:UDF 是独立能力域(后续会高频扩展、需本地单测),不应锁死在 `spark/` 子树里。联动:`dw_base/__init__.py:27` 常量、`bin/spark-sql-starter.py` + `bin/excel_to_hive.py` 文件头 SQL 样例注释、`dw_base/udf/common/spark_common_udf.py` 模块 docstring、`kb/00-项目架构.md`(目录树新增 `udf/` 行 + 模块职责表 + Mermaid 节点)、`kb/23-标签体系.md §5` bitmap UDF 注册路径。`bin/spark-sql-starter.py:172-173` 用的是常量自动生效 | — |
 | 2026-04-20 | **修正 §7.1 pyspark 误记**:前期文档把 pyspark 列进强依赖 KEEP 行 + "pyspark 2.4.0 固定" 一句,均与真实的 `requirements.txt` 不符。真实机制:`findspark==2.0.1` 运行时定位 CDH 集群已装 PySpark,版本随集群走,客户端不固定也不入 `requirements.txt`。kb/90 §7.1 表格 KEEP 列去 pyspark + "后续事项"末行改为 findspark 机制说明 | — |
 | 2026-04-20 | **UDF 模块重组(重构计划外)**:独立 `dw_base/spark/udf/` 目录结构为 `common/`(通用 UDF,SparkSQL 入口自动 `ADD FILE` 注册)+ `business/`(业务专用 UDF,SQL 中按需 `ADD FILE` 加载)两类。(a) 6 份源文件(根 `spark_common_udf.py` 24 函数 + `spark_json_array_udf.py` 23 函数 + `spark_mmq_udf.py` 3 函数 + `customs/cts_common.py` + `product/escape_udf.py` + `enterprise/spark_eng_ent_json_array_append_udf.py`)通读 + 去重 + 业务耦合剥离后,合并为单文件 `common/spark_common_udf.py`(500 行 40 函数,分 JSON / Array / String / Numeric-Date-Hash / Cross-type-converters 5 段)。单文件方案而非按类型拆分,理由:跨类型转换函数(`json2str` / `arr2json` / `str2map` 等约 9 个,占 20%+)没有明确归属,强行分只会制造边界争议。(b) 清理 `dw_base/spark/udf/` 下所有老业务 UDF 子目录与根级业务文件共 60 个:整目录删 `contacts/` / `customs/` / `enterprise/` / `product/` / `productApplication/` / `test/`;根目录删 `spark_eng_ent_name_clean.py` / `spark_india_format_phone_udf.py` / `solr_similar_match_udf.py` / `main_test.py` 以及 3 份源 UDF 文件。(c) `dw_base/__init__.py:27` `COMMON_SPARK_UDF_FILE` 常量路径由 `dw_base/spark/udf/spark_common_udf.py` 改为 `dw_base/spark/udf/common/spark_common_udf.py`(`bin/spark-sql-starter.py:172-173` 两处 usage 靠常量传递自动生效)。(d) 删除老 `dingtalk_*` / `mg2es` 级联清理中没赶上的 UDF 业务耦合文件在此批统一清零。`business/` 目录暂为骨架,后续真正出现新业务 UDF 时按需补 | — |

+ 1 - 0
requirements.txt

@@ -1,4 +1,5 @@
 
+pyspark==2.4.0
 findspark==2.0.1