wedata3-feature-engineering 0.2.6.dev3__tar.gz → 0.2.6.dev4__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {wedata3_feature_engineering-0.2.6.dev3 → wedata3-feature-engineering-0.2.6.dev4}/PKG-INFO +6 -25
- {wedata3_feature_engineering-0.2.6.dev3 → wedata3-feature-engineering-0.2.6.dev4}/wedata/common/cloud_sdk_client/models.py +2 -2
- {wedata3_feature_engineering-0.2.6.dev3 → wedata3-feature-engineering-0.2.6.dev4}/wedata/common/constants/constants.py +1 -1
- {wedata3_feature_engineering-0.2.6.dev3 → wedata3-feature-engineering-0.2.6.dev4}/wedata/common/online_store/packed_codec.py +23 -0
- {wedata3_feature_engineering-0.2.6.dev3 → wedata3-feature-engineering-0.2.6.dev4}/wedata/feature_engineering/client.py +1 -1
- {wedata3_feature_engineering-0.2.6.dev3 → wedata3-feature-engineering-0.2.6.dev4}/wedata/feature_engineering/table_client/table_client.py +9 -9
- {wedata3_feature_engineering-0.2.6.dev3 → wedata3-feature-engineering-0.2.6.dev4}/wedata3_feature_engineering.egg-info/PKG-INFO +6 -25
- {wedata3_feature_engineering-0.2.6.dev3 → wedata3-feature-engineering-0.2.6.dev4}/wedata3_feature_engineering.egg-info/SOURCES.txt +0 -13
- wedata3_feature_engineering-0.2.6.dev3/tests/test_build_executor_deps.py +0 -52
- wedata3_feature_engineering-0.2.6.dev3/tests/test_cleanup_packed.py +0 -405
- wedata3_feature_engineering-0.2.6.dev3/tests/test_client.py +0 -1722
- wedata3_feature_engineering-0.2.6.dev3/tests/test_common_utils.py +0 -8
- wedata3_feature_engineering-0.2.6.dev3/tests/test_feast_client_validate_keys.py +0 -190
- wedata3_feature_engineering-0.2.6.dev3/tests/test_feature_spec_training_set.py +0 -313
- wedata3_feature_engineering-0.2.6.dev3/tests/test_feature_store.py +0 -388
- wedata3_feature_engineering-0.2.6.dev3/tests/test_feature_table_client_validate_keys.py +0 -192
- wedata3_feature_engineering-0.2.6.dev3/tests/test_packed_codec.py +0 -425
- wedata3_feature_engineering-0.2.6.dev3/tests/test_redis_packed.py +0 -427
- wedata3_feature_engineering-0.2.6.dev3/tests/test_sync_template.py +0 -289
- wedata3_feature_engineering-0.2.6.dev3/tests/test_table_client.py +0 -154
- wedata3_feature_engineering-0.2.6.dev3/tests/test_table_client_dispatch.py +0 -223
- {wedata3_feature_engineering-0.2.6.dev3 → wedata3-feature-engineering-0.2.6.dev4}/README.md +0 -0
- {wedata3_feature_engineering-0.2.6.dev3 → wedata3-feature-engineering-0.2.6.dev4}/setup.cfg +0 -0
- {wedata3_feature_engineering-0.2.6.dev3 → wedata3-feature-engineering-0.2.6.dev4}/setup.py +0 -0
- {wedata3_feature_engineering-0.2.6.dev3 → wedata3-feature-engineering-0.2.6.dev4}/wedata/__init__.py +0 -0
- {wedata3_feature_engineering-0.2.6.dev3 → wedata3-feature-engineering-0.2.6.dev4}/wedata/common/__init__.py +0 -0
- {wedata3_feature_engineering-0.2.6.dev3 → wedata3-feature-engineering-0.2.6.dev4}/wedata/common/base_table_client/__init__.py +0 -0
- {wedata3_feature_engineering-0.2.6.dev3 → wedata3-feature-engineering-0.2.6.dev4}/wedata/common/base_table_client/base.py +0 -0
- {wedata3_feature_engineering-0.2.6.dev3 → wedata3-feature-engineering-0.2.6.dev4}/wedata/common/cloud_sdk_client/__init__.py +0 -0
- {wedata3_feature_engineering-0.2.6.dev3 → wedata3-feature-engineering-0.2.6.dev4}/wedata/common/cloud_sdk_client/client.py +0 -0
- {wedata3_feature_engineering-0.2.6.dev3 → wedata3-feature-engineering-0.2.6.dev4}/wedata/common/cloud_sdk_client/utils.py +0 -0
- {wedata3_feature_engineering-0.2.6.dev3 → wedata3-feature-engineering-0.2.6.dev4}/wedata/common/constants/__init__.py +0 -0
- {wedata3_feature_engineering-0.2.6.dev3 → wedata3-feature-engineering-0.2.6.dev4}/wedata/common/constants/engine_types.py +0 -0
- {wedata3_feature_engineering-0.2.6.dev3 → wedata3-feature-engineering-0.2.6.dev4}/wedata/common/entities/__init__.py +0 -0
- {wedata3_feature_engineering-0.2.6.dev3 → wedata3-feature-engineering-0.2.6.dev4}/wedata/common/entities/column_info.py +0 -0
- {wedata3_feature_engineering-0.2.6.dev3 → wedata3-feature-engineering-0.2.6.dev4}/wedata/common/entities/environment_variables.py +0 -0
- {wedata3_feature_engineering-0.2.6.dev3 → wedata3-feature-engineering-0.2.6.dev4}/wedata/common/entities/feature.py +0 -0
- {wedata3_feature_engineering-0.2.6.dev3 → wedata3-feature-engineering-0.2.6.dev4}/wedata/common/entities/feature_column_info.py +0 -0
- {wedata3_feature_engineering-0.2.6.dev3 → wedata3-feature-engineering-0.2.6.dev4}/wedata/common/entities/feature_function.py +0 -0
- {wedata3_feature_engineering-0.2.6.dev3 → wedata3-feature-engineering-0.2.6.dev4}/wedata/common/entities/feature_lookup.py +0 -0
- {wedata3_feature_engineering-0.2.6.dev3 → wedata3-feature-engineering-0.2.6.dev4}/wedata/common/entities/feature_spec.py +0 -0
- {wedata3_feature_engineering-0.2.6.dev3 → wedata3-feature-engineering-0.2.6.dev4}/wedata/common/entities/feature_spec_constants.py +0 -0
- {wedata3_feature_engineering-0.2.6.dev3 → wedata3-feature-engineering-0.2.6.dev4}/wedata/common/entities/feature_table.py +0 -0
- {wedata3_feature_engineering-0.2.6.dev3 → wedata3-feature-engineering-0.2.6.dev4}/wedata/common/entities/feature_table_info.py +0 -0
- {wedata3_feature_engineering-0.2.6.dev3 → wedata3-feature-engineering-0.2.6.dev4}/wedata/common/entities/function_info.py +0 -0
- {wedata3_feature_engineering-0.2.6.dev3 → wedata3-feature-engineering-0.2.6.dev4}/wedata/common/entities/on_demand_column_info.py +0 -0
- {wedata3_feature_engineering-0.2.6.dev3 → wedata3-feature-engineering-0.2.6.dev4}/wedata/common/entities/source_data_column_info.py +0 -0
- {wedata3_feature_engineering-0.2.6.dev3 → wedata3-feature-engineering-0.2.6.dev4}/wedata/common/entities/training_set.py +0 -0
- {wedata3_feature_engineering-0.2.6.dev3 → wedata3-feature-engineering-0.2.6.dev4}/wedata/common/feast_client/__init__.py +0 -0
- {wedata3_feature_engineering-0.2.6.dev3 → wedata3-feature-engineering-0.2.6.dev4}/wedata/common/feast_client/feast_client.py +0 -0
- {wedata3_feature_engineering-0.2.6.dev3 → wedata3-feature-engineering-0.2.6.dev4}/wedata/common/log/__init__.py +0 -0
- {wedata3_feature_engineering-0.2.6.dev3 → wedata3-feature-engineering-0.2.6.dev4}/wedata/common/log/logger.py +0 -0
- {wedata3_feature_engineering-0.2.6.dev3 → wedata3-feature-engineering-0.2.6.dev4}/wedata/common/online_store/__init__.py +0 -0
- {wedata3_feature_engineering-0.2.6.dev3 → wedata3-feature-engineering-0.2.6.dev4}/wedata/common/protos/__init__.py +0 -0
- {wedata3_feature_engineering-0.2.6.dev3 → wedata3-feature-engineering-0.2.6.dev4}/wedata/common/protos/feature_store_pb2.py +0 -0
- {wedata3_feature_engineering-0.2.6.dev3 → wedata3-feature-engineering-0.2.6.dev4}/wedata/common/spark_client/__init__.py +0 -0
- {wedata3_feature_engineering-0.2.6.dev3 → wedata3-feature-engineering-0.2.6.dev4}/wedata/common/spark_client/spark_client.py +0 -0
- {wedata3_feature_engineering-0.2.6.dev3 → wedata3-feature-engineering-0.2.6.dev4}/wedata/common/utils/__init__.py +0 -0
- {wedata3_feature_engineering-0.2.6.dev3 → wedata3-feature-engineering-0.2.6.dev4}/wedata/common/utils/common_utils.py +0 -0
- {wedata3_feature_engineering-0.2.6.dev3 → wedata3-feature-engineering-0.2.6.dev4}/wedata/common/utils/env_utils.py +0 -0
- {wedata3_feature_engineering-0.2.6.dev3 → wedata3-feature-engineering-0.2.6.dev4}/wedata/common/utils/feature_lookup_utils.py +0 -0
- {wedata3_feature_engineering-0.2.6.dev3 → wedata3-feature-engineering-0.2.6.dev4}/wedata/common/utils/feature_spec_utils.py +0 -0
- {wedata3_feature_engineering-0.2.6.dev3 → wedata3-feature-engineering-0.2.6.dev4}/wedata/common/utils/feature_utils.py +0 -0
- {wedata3_feature_engineering-0.2.6.dev3 → wedata3-feature-engineering-0.2.6.dev4}/wedata/common/utils/on_demand_utils.py +0 -0
- {wedata3_feature_engineering-0.2.6.dev3 → wedata3-feature-engineering-0.2.6.dev4}/wedata/common/utils/schema_utils.py +0 -0
- {wedata3_feature_engineering-0.2.6.dev3 → wedata3-feature-engineering-0.2.6.dev4}/wedata/common/utils/signature_utils.py +0 -0
- {wedata3_feature_engineering-0.2.6.dev3 → wedata3-feature-engineering-0.2.6.dev4}/wedata/common/utils/topological_sort.py +0 -0
- {wedata3_feature_engineering-0.2.6.dev3 → wedata3-feature-engineering-0.2.6.dev4}/wedata/common/utils/training_set_utils.py +0 -0
- {wedata3_feature_engineering-0.2.6.dev3 → wedata3-feature-engineering-0.2.6.dev4}/wedata/common/utils/uc_utils.py +0 -0
- {wedata3_feature_engineering-0.2.6.dev3 → wedata3-feature-engineering-0.2.6.dev4}/wedata/common/utils/validation_utils.py +0 -0
- {wedata3_feature_engineering-0.2.6.dev3 → wedata3-feature-engineering-0.2.6.dev4}/wedata/feature_engineering/__init__.py +0 -0
- {wedata3_feature_engineering-0.2.6.dev3 → wedata3-feature-engineering-0.2.6.dev4}/wedata/feature_engineering/feast/__init__.py +0 -0
- {wedata3_feature_engineering-0.2.6.dev3 → wedata3-feature-engineering-0.2.6.dev4}/wedata/feature_engineering/feast/infra/__init__.py +0 -0
- {wedata3_feature_engineering-0.2.6.dev3 → wedata3-feature-engineering-0.2.6.dev4}/wedata/feature_engineering/feast/infra/online_store/__init__.py +0 -0
- {wedata3_feature_engineering-0.2.6.dev3 → wedata3-feature-engineering-0.2.6.dev4}/wedata/feature_engineering/feast/infra/online_store/cleanup_packed.py +0 -0
- {wedata3_feature_engineering-0.2.6.dev3 → wedata3-feature-engineering-0.2.6.dev4}/wedata/feature_engineering/feast/infra/online_store/postgres.py +0 -0
- {wedata3_feature_engineering-0.2.6.dev3 → wedata3-feature-engineering-0.2.6.dev4}/wedata/feature_engineering/feast/infra/online_store/redis_packed.py +0 -0
- {wedata3_feature_engineering-0.2.6.dev3 → wedata3-feature-engineering-0.2.6.dev4}/wedata/feature_engineering/ml_training_client/__init__.py +0 -0
- {wedata3_feature_engineering-0.2.6.dev3 → wedata3-feature-engineering-0.2.6.dev4}/wedata/feature_engineering/ml_training_client/ml_training_client.py +0 -0
- {wedata3_feature_engineering-0.2.6.dev3 → wedata3-feature-engineering-0.2.6.dev4}/wedata/feature_engineering/mlflow_model.py +0 -0
- {wedata3_feature_engineering-0.2.6.dev3 → wedata3-feature-engineering-0.2.6.dev4}/wedata/feature_engineering/table_client/__init__.py +0 -0
- {wedata3_feature_engineering-0.2.6.dev3 → wedata3-feature-engineering-0.2.6.dev4}/wedata/feature_store/__init__.py +0 -0
- {wedata3_feature_engineering-0.2.6.dev3 → wedata3-feature-engineering-0.2.6.dev4}/wedata/feature_store/client.py +0 -0
- {wedata3_feature_engineering-0.2.6.dev3 → wedata3-feature-engineering-0.2.6.dev4}/wedata/feature_store/common/__init__.py +0 -0
- {wedata3_feature_engineering-0.2.6.dev3 → wedata3-feature-engineering-0.2.6.dev4}/wedata/feature_store/common/store_config/__init__.py +0 -0
- {wedata3_feature_engineering-0.2.6.dev3 → wedata3-feature-engineering-0.2.6.dev4}/wedata/feature_store/common/store_config/redis.py +0 -0
- {wedata3_feature_engineering-0.2.6.dev3 → wedata3-feature-engineering-0.2.6.dev4}/wedata/feature_store/constants/__init__.py +0 -0
- {wedata3_feature_engineering-0.2.6.dev3 → wedata3-feature-engineering-0.2.6.dev4}/wedata/feature_store/constants/engine_types.py +0 -0
- {wedata3_feature_engineering-0.2.6.dev3 → wedata3-feature-engineering-0.2.6.dev4}/wedata/feature_store/feature_table_client/__init__.py +0 -0
- {wedata3_feature_engineering-0.2.6.dev3 → wedata3-feature-engineering-0.2.6.dev4}/wedata/feature_store/feature_table_client/feature_table_client.py +0 -0
- {wedata3_feature_engineering-0.2.6.dev3 → wedata3-feature-engineering-0.2.6.dev4}/wedata/feature_store/mlflow_model.py +0 -0
- {wedata3_feature_engineering-0.2.6.dev3 → wedata3-feature-engineering-0.2.6.dev4}/wedata/feature_store/training_set_client/__init__.py +0 -0
- {wedata3_feature_engineering-0.2.6.dev3 → wedata3-feature-engineering-0.2.6.dev4}/wedata/feature_store/training_set_client/training_set_client.py +0 -0
- {wedata3_feature_engineering-0.2.6.dev3 → wedata3-feature-engineering-0.2.6.dev4}/wedata/tempo/__init__.py +0 -0
- {wedata3_feature_engineering-0.2.6.dev3 → wedata3-feature-engineering-0.2.6.dev4}/wedata/tempo/interpol.py +0 -0
- {wedata3_feature_engineering-0.2.6.dev3 → wedata3-feature-engineering-0.2.6.dev4}/wedata/tempo/intervals.py +0 -0
- {wedata3_feature_engineering-0.2.6.dev3 → wedata3-feature-engineering-0.2.6.dev4}/wedata/tempo/io.py +0 -0
- {wedata3_feature_engineering-0.2.6.dev3 → wedata3-feature-engineering-0.2.6.dev4}/wedata/tempo/ml.py +0 -0
- {wedata3_feature_engineering-0.2.6.dev3 → wedata3-feature-engineering-0.2.6.dev4}/wedata/tempo/resample.py +0 -0
- {wedata3_feature_engineering-0.2.6.dev3 → wedata3-feature-engineering-0.2.6.dev4}/wedata/tempo/tsdf.py +0 -0
- {wedata3_feature_engineering-0.2.6.dev3 → wedata3-feature-engineering-0.2.6.dev4}/wedata/tempo/utils.py +0 -0
- {wedata3_feature_engineering-0.2.6.dev3 → wedata3-feature-engineering-0.2.6.dev4}/wedata3_feature_engineering.egg-info/dependency_links.txt +0 -0
- {wedata3_feature_engineering-0.2.6.dev3 → wedata3-feature-engineering-0.2.6.dev4}/wedata3_feature_engineering.egg-info/requires.txt +0 -0
- {wedata3_feature_engineering-0.2.6.dev3 → wedata3-feature-engineering-0.2.6.dev4}/wedata3_feature_engineering.egg-info/top_level.txt +0 -0
|
@@ -1,41 +1,20 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
1
|
+
Metadata-Version: 2.1
|
|
2
2
|
Name: wedata3-feature-engineering
|
|
3
|
-
Version: 0.2.6.
|
|
3
|
+
Version: 0.2.6.dev4
|
|
4
4
|
Summary: Wedata Feature Engineering Library Development
|
|
5
|
-
Home-page:
|
|
5
|
+
Home-page: UNKNOWN
|
|
6
6
|
Author: meahqian
|
|
7
7
|
Author-email:
|
|
8
8
|
License: Apache 2.0
|
|
9
|
+
Platform: UNKNOWN
|
|
9
10
|
Classifier: Programming Language :: Python :: 3
|
|
10
11
|
Classifier: License :: OSI Approved :: Apache Software License
|
|
11
12
|
Classifier: Operating System :: OS Independent
|
|
12
13
|
Requires-Python: >=3.10
|
|
13
14
|
Description-Content-Type: text/markdown
|
|
14
|
-
Requires-Dist: pandas>=1.0.0
|
|
15
|
-
Requires-Dist: feast[postgres,redis]==0.49.0
|
|
16
|
-
Requires-Dist: grpcio==1.74.0
|
|
17
|
-
Requires-Dist: msgpack<2,>=1.0
|
|
18
|
-
Requires-Dist: tencentcloud-sdk-python
|
|
19
|
-
Requires-Dist: ipython
|
|
20
|
-
Requires-Dist: msgpack<2.0.0,>=1.0.0
|
|
21
15
|
Provides-Extra: mlflow2
|
|
22
|
-
Requires-Dist: mlflow==2.17.2; extra == "mlflow2"
|
|
23
16
|
Provides-Extra: mlflow3
|
|
24
|
-
Requires-Dist: mlflow<3.11.0,>=3.10.0; extra == "mlflow3"
|
|
25
17
|
Provides-Extra: dev
|
|
26
|
-
Requires-Dist: flake8; extra == "dev"
|
|
27
|
-
Requires-Dist: pytest; extra == "dev"
|
|
28
|
-
Requires-Dist: python-dotenv; extra == "dev"
|
|
29
|
-
Requires-Dist: fakeredis[lua]; extra == "dev"
|
|
30
|
-
Dynamic: author
|
|
31
|
-
Dynamic: classifier
|
|
32
|
-
Dynamic: description
|
|
33
|
-
Dynamic: description-content-type
|
|
34
|
-
Dynamic: license
|
|
35
|
-
Dynamic: provides-extra
|
|
36
|
-
Dynamic: requires-dist
|
|
37
|
-
Dynamic: requires-python
|
|
38
|
-
Dynamic: summary
|
|
39
18
|
|
|
40
19
|
# wedata3-feature-engineering
|
|
41
20
|
|
|
@@ -160,3 +139,5 @@ bash build.sh
|
|
|
160
139
|
## 许可证
|
|
161
140
|
|
|
162
141
|
Apache License 2.0
|
|
142
|
+
|
|
143
|
+
|
|
@@ -1184,7 +1184,7 @@ class CreateOnlineTableRequest(AbstractModel):
|
|
|
1184
1184
|
TargetPath: 目标路径
|
|
1185
1185
|
OfflineFeatureConfiguration: 离线表信息
|
|
1186
1186
|
TaskSchedulerConfiguration: 任务调度配置
|
|
1187
|
-
OnlineStoreType: 在线存储类型(
|
|
1187
|
+
OnlineStoreType: 在线存储类型(TENCENT_POSTGRE | REDIS,缺省 TENCENT_POSTGRE)
|
|
1188
1188
|
"""
|
|
1189
1189
|
|
|
1190
1190
|
def __init__(self) -> None:
|
|
@@ -1351,7 +1351,7 @@ class DeleteOnlineTableRequest(AbstractModel):
|
|
|
1351
1351
|
WorkspaceId: 工作空间ID
|
|
1352
1352
|
TableNameInfo: 表信息
|
|
1353
1353
|
ResourceGroupId: 资源组ID
|
|
1354
|
-
OnlineStoreType: 在线存储类型(
|
|
1354
|
+
OnlineStoreType: 在线存储类型(TENCENT_POSTGRE | REDIS,缺省 TENCENT_POSTGRE)
|
|
1355
1355
|
"""
|
|
1356
1356
|
def __init__(self) -> None:
|
|
1357
1357
|
self._WorkspaceId = None
|
|
@@ -46,7 +46,7 @@ FEATURE_LOOKUP_CLIENT_PIP_PACKAGE = "wedata3-feature-engineering"
|
|
|
46
46
|
# 特征查找版本号
|
|
47
47
|
# FEATURE_LOOKUP_CLIENT_MAJOR_VERSION = "0.6.16"
|
|
48
48
|
# FEATURE_LOOKUP_CLIENT_PIP_PACKAGE_VERSION = f"{FEATURE_LOOKUP_CLIENT_PIP_PACKAGE}>=0.6.16"
|
|
49
|
-
FEATURE_LOOKUP_CLIENT_MAJOR_VERSION = "0.2.6.
|
|
49
|
+
FEATURE_LOOKUP_CLIENT_MAJOR_VERSION = "0.2.6.dev4"
|
|
50
50
|
FEATURE_LOOKUP_CLIENT_PIP_PACKAGE_VERSION = f"{FEATURE_LOOKUP_CLIENT_PIP_PACKAGE}>=0.2.4"
|
|
51
51
|
|
|
52
52
|
# 特征存储内部数据目录
|
|
@@ -50,6 +50,29 @@ _DATA_VERSION_RAND_LEN = 2
|
|
|
50
50
|
_OVERSIZE_WARNED: set = set()
|
|
51
51
|
|
|
52
52
|
|
|
53
|
+
def _check_msgpack_impl() -> None:
|
|
54
|
+
"""检测 msgpack 是否走 C 扩展实现(方案 D3.1.1 落地约束:防静默降级)。
|
|
55
|
+
|
|
56
|
+
zipimport 等场景下 msgpack 会静默退回纯 Python 实现,5 亿行同步慢数十倍。
|
|
57
|
+
Executor 上通过 ``spark.executorEnv.PYTHONPATH=./deps`` 分发的归档若平台 ABI
|
|
58
|
+
不匹配即触发该情况,必须在运行时告警而不是等同步超时才发现。
|
|
59
|
+
"""
|
|
60
|
+
try:
|
|
61
|
+
import msgpack
|
|
62
|
+
|
|
63
|
+
if "fallback" in str(msgpack.Packer):
|
|
64
|
+
logger.warning(
|
|
65
|
+
"msgpack is running in PURE-PYTHON fallback mode (C extension not loaded); "
|
|
66
|
+
"redis packed sync will be extremely slow. Check that the executor deps archive "
|
|
67
|
+
"matches the executor platform/ABI (see scripts/build_executor_deps.sh)."
|
|
68
|
+
)
|
|
69
|
+
except Exception: # pragma: no cover - 检测本身不允许影响主流程
|
|
70
|
+
logger.warning("msgpack implementation check skipped (import failed)", exc_info=True)
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
_check_msgpack_impl()
|
|
74
|
+
|
|
75
|
+
|
|
53
76
|
class PackedCodecError(ValueError):
|
|
54
77
|
"""编解码层的显式失败(对应 codec 设计 §8 的 F2/F3/F8 等)。"""
|
|
55
78
|
|
|
@@ -1095,7 +1095,7 @@ class FeatureEngineeringClient:
|
|
|
1095
1095
|
由用户根据所在工作空间已配置的在线 catalog 显式指定(如 `DataLakeCatalog`),
|
|
1096
1096
|
SDK 不提供默认兜底以避免在多 catalog 场景下静默连接错误的 PG 实例。Redis 不传
|
|
1097
1097
|
trigger: [可选]周期性任务的调度配置
|
|
1098
|
-
online_store_type: [可选]"
|
|
1098
|
+
online_store_type: [可选]"TENCENT_POSTGRE"(默认)或 "REDIS"。Redis 在线表由离线表与
|
|
1099
1099
|
工作空间的 Redis 数据源确定,不需要也不接受在线库表名
|
|
1100
1100
|
"""
|
|
1101
1101
|
kwargs = {}
|
|
@@ -813,7 +813,7 @@ class FeatureEngineeringTableClient(AbstractBaseTableClient):
|
|
|
813
813
|
Properties 中没有 connectionId,则降级走 TCCatalog 模式。常见取值如 `DataLakeCatalog`,
|
|
814
814
|
具体需结合所在工作空间已配置的在线 catalog 决定,禁止由 SDK 默认兜底。Redis 不传
|
|
815
815
|
trigger: [可选]周期性任务的调度配置
|
|
816
|
-
online_store_type: [可选]在线存储类型,"
|
|
816
|
+
online_store_type: [可选]在线存储类型,"TENCENT_POSTGRE"(默认)或 "REDIS"。
|
|
817
817
|
传 "REDIS" 时:在线表由离线表与 Redis 数据源确定,不需要在线库表名(传了即报错);
|
|
818
818
|
不支持持续同步(trigger 的 TriggerMode=CONTINUE_RUN 即报错),只支持 SNAPSHOT / TIME_TRIGGER;
|
|
819
819
|
同一离线表只能发布到 PG 或 Redis 其中一种(服务端校验);
|
|
@@ -830,11 +830,11 @@ class FeatureEngineeringTableClient(AbstractBaseTableClient):
|
|
|
830
830
|
"""
|
|
831
831
|
# store 类型分派(不传 = PG,行为与历史版本完全一致)
|
|
832
832
|
if online_store_type is None:
|
|
833
|
-
online_store_type = "
|
|
833
|
+
online_store_type = "TENCENT_POSTGRE"
|
|
834
834
|
online_store_type = online_store_type.upper()
|
|
835
|
-
if online_store_type not in ("
|
|
835
|
+
if online_store_type not in ("TENCENT_POSTGRE", "REDIS"):
|
|
836
836
|
raise ValueError(
|
|
837
|
-
f"online_store_type must be '
|
|
837
|
+
f"online_store_type must be 'TENCENT_POSTGRE' or 'REDIS', got {online_store_type!r}"
|
|
838
838
|
)
|
|
839
839
|
online_names = {
|
|
840
840
|
"online_db_name": online_db_name,
|
|
@@ -868,12 +868,12 @@ class FeatureEngineeringTableClient(AbstractBaseTableClient):
|
|
|
868
868
|
]
|
|
869
869
|
if given_redis:
|
|
870
870
|
raise ValueError(
|
|
871
|
-
f"{', '.join(given_redis)} must not be set for
|
|
871
|
+
f"{', '.join(given_redis)} must not be set for TENCENT_POSTGRE: "
|
|
872
872
|
f"the PG connection is resolved from online_catalog_name on the server side"
|
|
873
873
|
)
|
|
874
874
|
missing = [k for k, v in online_names.items() if not v]
|
|
875
875
|
if missing:
|
|
876
|
-
raise ValueError(f"{', '.join(missing)} is required for
|
|
876
|
+
raise ValueError(f"{', '.join(missing)} is required for TENCENT_POSTGRE online table")
|
|
877
877
|
|
|
878
878
|
# 构建完整表名
|
|
879
879
|
full_table_name = common_utils.build_full_table_name(table_name, schema_name, catalog_name, self._spark)
|
|
@@ -1037,16 +1037,16 @@ class FeatureEngineeringTableClient(AbstractBaseTableClient):
|
|
|
1037
1037
|
catalog_name: 数据目录名称
|
|
1038
1038
|
schema_name: 数据库名称
|
|
1039
1039
|
table_name: 表名
|
|
1040
|
-
online_store_type: [可选]在线存储类型,"
|
|
1040
|
+
online_store_type: [可选]在线存储类型,"TENCENT_POSTGRE" 或 "REDIS"。不传时由服务端按标签判定;
|
|
1041
1041
|
传了也以标签为准(不一致时服务端告警)。
|
|
1042
1042
|
Raises:
|
|
1043
1043
|
RuntimeError: 当删除操作失败时抛出
|
|
1044
1044
|
"""
|
|
1045
1045
|
if online_store_type is not None:
|
|
1046
1046
|
online_store_type = online_store_type.upper()
|
|
1047
|
-
if online_store_type not in ("
|
|
1047
|
+
if online_store_type not in ("TENCENT_POSTGRE", "REDIS"):
|
|
1048
1048
|
raise ValueError(
|
|
1049
|
-
f"online_store_type must be '
|
|
1049
|
+
f"online_store_type must be 'TENCENT_POSTGRE' or 'REDIS', got {online_store_type!r}"
|
|
1050
1050
|
)
|
|
1051
1051
|
|
|
1052
1052
|
# 接口分页参数
|
|
@@ -1,41 +1,20 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
1
|
+
Metadata-Version: 2.1
|
|
2
2
|
Name: wedata3-feature-engineering
|
|
3
|
-
Version: 0.2.6.
|
|
3
|
+
Version: 0.2.6.dev4
|
|
4
4
|
Summary: Wedata Feature Engineering Library Development
|
|
5
|
-
Home-page:
|
|
5
|
+
Home-page: UNKNOWN
|
|
6
6
|
Author: meahqian
|
|
7
7
|
Author-email:
|
|
8
8
|
License: Apache 2.0
|
|
9
|
+
Platform: UNKNOWN
|
|
9
10
|
Classifier: Programming Language :: Python :: 3
|
|
10
11
|
Classifier: License :: OSI Approved :: Apache Software License
|
|
11
12
|
Classifier: Operating System :: OS Independent
|
|
12
13
|
Requires-Python: >=3.10
|
|
13
14
|
Description-Content-Type: text/markdown
|
|
14
|
-
Requires-Dist: pandas>=1.0.0
|
|
15
|
-
Requires-Dist: feast[postgres,redis]==0.49.0
|
|
16
|
-
Requires-Dist: grpcio==1.74.0
|
|
17
|
-
Requires-Dist: msgpack<2,>=1.0
|
|
18
|
-
Requires-Dist: tencentcloud-sdk-python
|
|
19
|
-
Requires-Dist: ipython
|
|
20
|
-
Requires-Dist: msgpack<2.0.0,>=1.0.0
|
|
21
15
|
Provides-Extra: mlflow2
|
|
22
|
-
Requires-Dist: mlflow==2.17.2; extra == "mlflow2"
|
|
23
16
|
Provides-Extra: mlflow3
|
|
24
|
-
Requires-Dist: mlflow<3.11.0,>=3.10.0; extra == "mlflow3"
|
|
25
17
|
Provides-Extra: dev
|
|
26
|
-
Requires-Dist: flake8; extra == "dev"
|
|
27
|
-
Requires-Dist: pytest; extra == "dev"
|
|
28
|
-
Requires-Dist: python-dotenv; extra == "dev"
|
|
29
|
-
Requires-Dist: fakeredis[lua]; extra == "dev"
|
|
30
|
-
Dynamic: author
|
|
31
|
-
Dynamic: classifier
|
|
32
|
-
Dynamic: description
|
|
33
|
-
Dynamic: description-content-type
|
|
34
|
-
Dynamic: license
|
|
35
|
-
Dynamic: provides-extra
|
|
36
|
-
Dynamic: requires-dist
|
|
37
|
-
Dynamic: requires-python
|
|
38
|
-
Dynamic: summary
|
|
39
18
|
|
|
40
19
|
# wedata3-feature-engineering
|
|
41
20
|
|
|
@@ -160,3 +139,5 @@ bash build.sh
|
|
|
160
139
|
## 许可证
|
|
161
140
|
|
|
162
141
|
Apache License 2.0
|
|
142
|
+
|
|
143
|
+
|
|
@@ -1,18 +1,5 @@
|
|
|
1
1
|
README.md
|
|
2
2
|
setup.py
|
|
3
|
-
tests/test_build_executor_deps.py
|
|
4
|
-
tests/test_cleanup_packed.py
|
|
5
|
-
tests/test_client.py
|
|
6
|
-
tests/test_common_utils.py
|
|
7
|
-
tests/test_feast_client_validate_keys.py
|
|
8
|
-
tests/test_feature_spec_training_set.py
|
|
9
|
-
tests/test_feature_store.py
|
|
10
|
-
tests/test_feature_table_client_validate_keys.py
|
|
11
|
-
tests/test_packed_codec.py
|
|
12
|
-
tests/test_redis_packed.py
|
|
13
|
-
tests/test_sync_template.py
|
|
14
|
-
tests/test_table_client.py
|
|
15
|
-
tests/test_table_client_dispatch.py
|
|
16
3
|
wedata/__init__.py
|
|
17
4
|
wedata/common/__init__.py
|
|
18
5
|
wedata/common/base_table_client/__init__.py
|
|
@@ -1,52 +0,0 @@
|
|
|
1
|
-
# -*- coding: utf-8 -*-
|
|
2
|
-
"""
|
|
3
|
-
scripts/build_executor_deps.sh 的静态检查(实跑需要 Linux x86_64 + 网络,放在发布流程里做)。
|
|
4
|
-
|
|
5
|
-
曾经的三个问题,任何一个都会让打出来的包在 Executor 上不可用:
|
|
6
|
-
1. 包名写成 tencent-wedata-feature-engineering,与 setup.py 不一致,pip 装不到;
|
|
7
|
-
2. --python-version 39 与 python_requires>=3.10 冲突,pip 拒装;
|
|
8
|
-
3. tar 打了外层 deps 目录,按 #deps 解压后变成 ./deps/deps/wedata,PYTHONPATH=./deps 找不到。
|
|
9
|
-
"""
|
|
10
|
-
|
|
11
|
-
import re
|
|
12
|
-
from pathlib import Path
|
|
13
|
-
|
|
14
|
-
ROOT = Path(__file__).resolve().parents[1]
|
|
15
|
-
SCRIPT = (ROOT / "scripts" / "build_executor_deps.sh").read_text(encoding="utf-8")
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
def _setup_value(key: str) -> str:
|
|
19
|
-
match = re.search(rf"{key}\s*=\s*['\"]([^'\"]+)['\"]", (ROOT / "setup.py").read_text(encoding="utf-8"))
|
|
20
|
-
assert match, f"setup.py 中找不到 {key}"
|
|
21
|
-
return match.group(1)
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
def test_package_name_matches_setup_py():
|
|
25
|
-
assert f'SDK_PACKAGE="{_setup_value("name")}"' in SCRIPT
|
|
26
|
-
assert "tencent-wedata-feature-engineering" not in SCRIPT
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
def test_default_sdk_version_matches_constants():
|
|
30
|
-
from wedata.common.constants.constants import FEATURE_LOOKUP_CLIENT_MAJOR_VERSION
|
|
31
|
-
|
|
32
|
-
assert f'SDK_VERSION="${{SDK_VERSION:-{FEATURE_LOOKUP_CLIENT_MAJOR_VERSION}}}"' in SCRIPT
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
def test_target_python_satisfies_python_requires():
|
|
36
|
-
required = _setup_value("python_requires")
|
|
37
|
-
minimum = tuple(int(x) for x in required.lstrip(">=").split("."))
|
|
38
|
-
default = re.search(r'PY_VERSION="\$\{PY_VERSION:-([\d.]+)\}"', SCRIPT).group(1)
|
|
39
|
-
assert tuple(int(x) for x in default.split(".")) >= minimum
|
|
40
|
-
assert '--python-version "$PY_VERSION"' in SCRIPT
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
def test_archive_root_is_package_dir():
|
|
44
|
-
"""归档里不能再套一层 deps:Spark 按 #deps 解压,PYTHONPATH=./deps 下要直接看到 wedata / msgpack。"""
|
|
45
|
-
assert 'tar -czf "${OUT_DIR}/${ARCHIVE_NAME}" -C "$STAGE_DIR/deps" .' in SCRIPT
|
|
46
|
-
assert not re.search(r'-C "\$STAGE_DIR" deps', SCRIPT)
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
def test_no_invalid_spark_conf_and_no_shasum():
|
|
50
|
-
code = "\n".join(line for line in SCRIPT.splitlines() if not line.lstrip().startswith("#"))
|
|
51
|
-
assert "spark.driverEnv" not in code # 不是 Spark 配置项
|
|
52
|
-
assert not re.search(r"\b(shasum|sha256sum)\s", code) # slim 镜像不一定有
|