ClickHouse数仓全量更新和增量更新思路

文章讲述了在使用Clickhouse的JDBC连接处理大数据量时,如何通过全量更新和增量更新策略避免内存和IO限制。全量更新将数据插入带ShardingKey的分布式表,利用cityHash64避免数据倾斜。增量更新则基于时间戳筛选数据,通过数据回插确保数据完整性,优化性能并保证主键唯一。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.全量更新

  • 使用clickhouse的jdbc连接别的数据库时,如果拉取一个大数据量的表时,存在io和内存限制可能会导致mermoy limit 报错,如 1亿数据量,会导致数据拉不到,任务失败小数据量的表可以考虑全量更新。
  • 先全量更新到接入层,接入层使用的是带shardingkey的分布式表,从源库拉的数直接插入到分布式表中,避免数据倾斜,这里需注意添加cyhash 采用cityHash64对主键进行散列在通过cyhash的shardingkey往分布式表里插,并把插入时间的时间字段即odg_dt取now() 打上时间标签,方便查询,批量更新时时间字段有很大用处
insert into src.src_data select *,cityHash64(id) as cyhash,now() as odg_dt from jdbc('mysql100','select * from test.jierumysql);
#生成中间临时表
drop table if exists shard_detail.shard_detail_data_tmp;
create table shard_detail.shard_detail_data_tmp engine=MergeTree order by  ifNULL(cityHash64(ID),0) as select * from shard_detail.shard_detail_data where 1=0;

  • 接入层到明细层数据,插入的数据按照最新时间的数据插入,如果是全量的话,Max(odg_dt)即为最新时间的全量数据
insert into shard_detail.data select * from shard_src.shard_src_data where  odg_dt=(select max(odg_dt) from  shard_src.shard_src_data)
#表更新
rename  table shard_detail.shard_detail_data to shard_detail.shard_detail_data_old
rename table shard_detail.shard_detail_data_tmp to shard_detail.shard_detail_data
drop table shard_detail.shard_detail_data_old
  • 在把临时表和正式表实现命名互换,drop掉老表,rename临时表到新表
  • 实现全量更新

2.增量更新

  • 批量更新考虑的是数据更新,大表全量的非必要性
  • 批量更新和全量更新的逻辑类似只是在明细层时做数据回插的工作
  • 接入层也需要做出更改,从原先的全量变以时间戳筛选
SELECT * FROM jdbc('mysql100','select * from (select * from test.jierumysql WHERE LAST_UPDATE_DATE >= date_add(now(),INTERVAL -5 DAY)) as t')
  • 这里是5天的数据量到接入层,接入层不考虑数据重复只存放拉取的数据,通过时间标签更新到明细层通过max(odg_time) 即查询最新的时间的数据,5天
  • 增量数据相对与全量的数据多了一步数据回插
insert into shard_detail.shard_detail_data_tmp select * from shard_detail.shard_detail_data where  ID not in (select  ID from shard_detail.shard_detail_data_tmp)
rename  table shard_detail.shard_detail_data to shard_detail.shard_detail_data_old
rename table shard_detail.shard_detail_data_tmp to shard_detail.shard_detail_data
drop table shard_detail.shard_detail_data_old
  • 数据回插可以很大效率的保证了数据完整性,相比与大数据量的全量更新,提升性能,大数据量源表,我只需拉一次数据,之后都通过增量更新来保证数据的完整,同时优化速率
  • 数据更新时会不会造成主键重复?
  • 当更新数据插入分布式表时相同id生成的hash值一样,再分发的时候会插入到同一台服务器上
  • 新的数据和老的数据会在同一台机器上,不会存在分布在不同的服务器上
  • 数据回插中的id not in 就保证了当临时表里存在这条id的新数据,老数据不会回插到临时表中实现数据的更新,数据增量更新需要保证主键唯一。
     
<think>好的,我现在需要帮助用户设计一个基于ClickHouse的股票F10库方案,包括DWDDWS层的实现。首先,我要回顾用户之前的问题我的回答,确保一致性。用户提到的是离线同步,所以不需要考虑实时处理,但需要确保据的准确性稳定性。 用户的需求是使用ClickHouse来构建,特别是DWDDWS层,最终生成DWS大宽表。之前给出的方案已经划分了主题域,比如公司基础信息、财务指标等,并提供了表结构示例。现在需要结合用户提供的引用内容,尤其是引用[1]中提到实时开发模块Kafka,但用户明确是离线同步,所以可能需要调整,确保离线处理的方法正确。 引用[2]强调库的四个特性:面向主题、集成、稳定、反映历史变化。因此,在设计DWD层时,要确保据按主题域组织,集成不同来源的据,并保持稳定。引用[3]提到据门户的重要性,所以最终的大宽表需要支持上层应用,如据分析决策。 接下来,我需要确定DWD层的设计。主题域划分可能需要详细,比如公司信息、股东结构、财务据、市场表现等。每个主题对应的表结构需要符合ClickHouse的特性,比如使用合适的引擎(如ReplacingMergeTree处理更新)、分区策略排序键。同时,据清洗标准化是关键,比如单位统一、异常值处理,以及维度编码。 对于DWS层,需要整合各个DWD层的表,形成宽表。可能需要使用物化视图或预聚合策略来提高查询性能。例如,将财务指标与股东结构关联,按时间维度聚合。需要注意JOIN操作在ClickHouse中的性能,可能需要调整引擎索引策略。 离线同步方面,用户提到使用DataX进行T+1同步,需要确认DataX的配置任务调度,比如使用Airflow来管理任务依赖。同时,据校验质量监控也是必须的,比如空值检查、值范围验证等。 用户之前的回答中提到了物化视图预计算字段,这可能需要在DWS层进一步优化。例如,计算移动平均ROE或股东集中度指标。此外,如何处理缓慢变化的维度(如行业分类变)也是一个问题,可能需要使用SCD2型表结构。 现在需要考虑用户可能的疑问,比如如何管理据版本,如何处理历史据的变化,以及如何优化查询性能。例如,使用ReplacingMergeTree引擎版本号来管理更新,或者使用Projection功能来加速特定查询。 最后,需要确保整个方案符合库的最佳实践,比如据分层清晰,各层职责明确,以及考虑未来的扩展性,比如支持多的据源或分析需求。同时,评估指标如据延迟、查询性能、存储压缩率也需要明确,以衡量方案的有效性。</think>### 股票F10ClickHouse建设方案(增强版) #### 一、DWD层深度设计 1. **主题域扩展设计** ```mermaid graph TD A[F10原始据] --> B{主题域划分} B --> C[公司基础信息] B --> D[股东结构变化] B --> E[财务报表(三表合一)] B --> F[行业对标据] B --> G[重大事项记录] ``` 2. **核心表结构优化** ```sql -- 三表合一的财务宽表(资产负债表+利润表+现金流量表) CREATE TABLE dwd_finance_wide ( stock_code LowCardinality(String), report_date Date, -- 资产负债表 total_assets Decimal(18,2), total_liabilities Decimal(18,2), -- 利润表 operating_income Decimal(18,2), net_profit Decimal(18,2), -- 现金流量表 net_cash_flow Decimal(18,2), -- 据质量标记 data_version UInt32, update_time DateTime DEFAULT now() ) ENGINE = ReplicatedReplacingMergeTree(data_version) PARTITION BY toYYYY(report_date) ORDER BY (stock_code, report_date) TTL update_time + INTERVAL 3 YEAR; ``` 3. **据治理策略** - **异常值处理**:对ROE>100%或负债率>100%的据自动标记审计标志 - **历史版本管理**:使用`data_version`字段实现财务据追溯 - **维度退化**:将行业分类直接冗余到事实表,减少JOIN操作[^1] #### 二、DWS大宽表实现方案 1. **宽表构建方法论** ```mermaid graph LR A[DWD_公司信息] --> C{星型模型} B[DWD_财务据] --> C D[DWD_股东据] --> C C --> E[DWS_股票全景宽表] E --> F[OLAP分析] E --> G[监管报送] ``` 2. **具体实现代码** ```sql CREATE MATERIALIZED VIEW dws_stock_panorama ENGINE = ReplicatedAggregatingMergeTree() PARTITION BY toQuarter(report_date) ORDER BY (stock_code, report_date) AS SELECT f.stock_code, c.industry_code, f.report_date, anyLast(f.net_profit) AS last_net_profit, sum(f.net_profit) OVER w AS rolling_net_profit, argMax(s.top1_holder, s.update_time) AS current_top_holder, arrayMap(x -> x.ratio, arraySort(s.shareholders, (x,y) -> y.ratio - x.ratio)) AS sorted_ratios FROM dwd_finance_wide f JOIN dwd_company_basic c USING (stock_code) LEFT JOIN dwd_shareholders s ON f.stock_code = s.stock_code WINDOW w AS (PARTITION BY f.stock_code ORDER BY f.report_date ROWS BETWEEN 3 PRECEDING AND CURRENT ROW) SETTINGS joined_subquery_requires_alias = 0; ``` 3. **性能优化手段** - **预聚合计算**:按季度预计算ROE、EPS等30+个关键指标 - **智能索引**:对`(industry_code, report_date)`建立跳索引 - **冷热分离**:近3年据用SSD存储,历史据转存至HDD #### 三、离线同步技术升级 1. **架构增强设计** ```mermaid graph TB subgraph 离线处理 A[源系统] --> B{据交换中心} B --> C[DataX] C --> D[据清洗] D --> E[质量校验] E --> F[(DWD层)] end F --> G[物化视图] G --> H[(DWS层)] ``` 2. **关键实现细节 ```python # 据质量校验规则示例 def validate_f10_data(row): # 校验资产负债表平衡 if abs(row['total_assets'] - (row['total_liabilities'] + row['equity'])) > 1e6: raise ValueError(f"资产负债表不平衡: {row['stock_code']}") # 校验股东比例总 if sum(holder['ratio'] for holder in row['shareholders']) > 100.5: row['warning'] = '股东总比例异常' return row ``` #### 四、据应用验证 ```sql -- 行业集中度分析(响应时间<800ms) SELECT industry_code, avg(sorted_ratios[1]) AS avg_top1_ratio, median(sorted_ratios[1]) AS median_top1_ratio, sumIf(last_net_profit, sorted_ratios[1] > 0.3) AS high_concentration_profit FROM dws_stock_panorama WHERE report_date BETWEEN '2022-01-01' AND '2023-12-31' GROUP BY industry_code HAVING avg_top1_ratio > 0.25 ORDER BY high_concentration_profit DESC; ``` #### 五、运维监控体系 1. **核心监控指标** ```mermaid graph LR A[据时效性] --> B{DWD层延迟<2h} A --> C{DWS视图刷新<30min} D[据完整性] --> E{主键重复率<0.01%} D --> F{空值率<1%} G[计算准确性] --> H{资产负债表平衡率100%} ``` #### 六、扩展优化建议 1. **时序据处理**:对股价据采用`TimeSeries`引擎优化 2. **监管合规**:建立`AS OF`历史快照表满足审计要求 3. **机器学习集成**:使用`MADlib`库直接进行财务指标预测 [^1]: 维度退化需确保维度据变频率低,建议建立维度变日志表 [^2]: 物化视图刷新策略建议采用定时增量更新,避免全量刷新影响性能 [^3]: 冷热分离需配合存储策略使用,建议设置TTL自动迁移 ### 相关问题扩展 1. 如何设计ClickHouse物化视图的增量刷新机制? 2. 针对股东频繁变动的股票,如何优化股东结构存储模型? 3. 怎样实现财务据的版本追溯查询? 4. 在跨据中心场景下,如何保证ClickHouse集群的据一致性?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值