T-Digest
- A new data structure for accurate on-line accumulation of rank-based statistics such as quantiles and trimmed means
- 官方实现 https://github.com/tdunning/t-digest
- 典型应用:统计分位数
- 原理:使用一种一维Kmeans的变体,来产生一种允许精确分位数统计的数据结构
UDAF
- spark3.0对udaf进行有优化
implement in spark
思路1:
- 简单的udaf,一个buffer持续聚合同一个group的数据
- 最后evaluate时候再调用T-Digest add,并计算
- 评价:可能存在内存问题
思路2
- 含有udt的udaf,即把TDigest对象包装进去,变成一种sparksql可以识别的类型
- 新来一个数据,就add到buffer中的TDigest中,省内存
- 最后evaluate时候只要再调用一下T-Digest获取结果就好了
- 评价:
- 内存友好,但是编程稍微复杂
- TDigest貌似要重新实现,不能用官方实现,因为序列化不好做(参考https://github.com/isarn/isarn-sketches)
参考实现
spark summit 2020 有一个相关的讲座https://databricks.com/session_na20/user-defined-aggregation-in-apache-spark-a-love-story
配套ppt
- 该talk说明了 spark2.x udaf广泛存在的内部序列化损耗,会对性能产生一定影响。