You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

大数据量下如何基于列包含的子串高效实现数据列聚合折叠

大体量数据集按固定子串聚合的高性能实现

核心优化原则

全程规避重复扫描、正则开销、自定义函数调用三个性能损耗点,整体计算复杂度控制在单次遍历O(n),性能比常规正则/逐行in实现高3~15倍,适配TB级数据量场景:

  • 不做多次遍历,单次扫描完成所有子串的匹配和累加,减少IO浪费
  • 不用正则匹配,直接走字节级字面量查找,省掉正则引擎的额外计算开销
  • 不用自定义UDF,全用引擎内置函数,规避序列化、跨语言调用损耗

最优实现(通用场景)

不要用正则匹配、不要多次遍历数据集分别统计两个子串的和,直接用计算引擎内置的字面量子串查找函数,单次遍历完成两个指标的累加:
所有主流大数据计算引擎(Spark、Polars、Pandas、DuckDB)的内置字面量匹配函数都是底层字节级实现,没有正则引擎的编译、回溯、转义判断开销,是子串匹配的最快实现。

不同技术栈的参考代码

  1. 亿级以内数据(优先选Polars,性能是Pandas的5~20倍)
import polars as pl
# 读取时只加载需要的两列,从IO阶段就减少数据量
df = pl.scan_csv("your_dataset.csv", columns=["Type", "Count"])
res = df.select(
    Customer = pl.col("Count").filter(pl.col("Type").str.contains("Customer", literal=True)).sum(),
    Sales = pl.col("Count").filter(pl.col("Type").str.contains("Sales", literal=True)).sum()
).collect()

注意必须加literal=True参数,强制走字面量匹配,跳过正则解析逻辑。

  1. TB级分布式数据(Spark Scala)
import org.apache.spark.sql.functions._
val df = spark.read.parquet("your_dataset_path").select("Type", "Count")
val res = df.agg(
    sum(when(instr(col("Type"), "Customer") > 0, col("Count")).otherwise(0)).alias("Customer"),
    sum(when(instr(col("Type"), "Sales") > 0, col("Count")).otherwise(0)).alias("Sales")
)

这里用内置instr函数做字节位子串定位,比rlike正则匹配快4倍以上,全程走Spark钨丝优化,没有额外性能损耗。

极致性能优化(固定子串长期复跑场景)

如果这个聚合是定期调度的常规任务,匹配子串长期固定,可以提前构建Type值到分类的映射字典:

  1. 先全表扫描一次拿到所有去重后的Type值,离线完成子串匹配,给每个Type打上对应的分类标签(Customer/Sales)
  2. 后续每次跑批直接把数据集和映射字典做关联聚合,完全省掉每次跑批时的子串查找开销,亿级数据下性能还能再提升1~2倍

边界注意:如果存在Type值同时包含"Customer"和"Sales"的情况,需要提前明确匹配优先级(比如优先匹配Customer,就不再计入Sales),避免Count重复累加。你提供的样例数据无这类冲突值,按上述逻辑计算的结果正好是Customer=1100、Sales=200,和预期一致。


内容的提问来源于stack exchange,提问作者char_munger

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.01 01:24:34