如何在pydruid中正确使用ThetaSketchOp实现指定后聚合计算
解决pydruid中ThetaSketch NOT操作的后聚合问题
我看你已经能用原生JSON查询实现想要的apple_&_not_orange结果,但pydruid代码里踩了个小细节坑——类的选择和参数格式没对应上Druid的要求。咱们对照你能跑通的JSON来修正:
问题出在哪
你之前用了ThetaSketchOp,但在pydruid里,对应Druid JSON中thetaSketchSetOp的正确类是ThetaSketchSetOp;另外操作符需要用大写的NOT,而不是小写的not,字段引用也要对应JSON里的fieldAccess用FieldAccess类来实现。
修正后的完整代码
result = query.groupby( datasource='datasource', granularity='all', intervals='2018-06-30/2018-08-30', filter=( (filters.Dimension('fruit') == 'apple') | (filters.Dimension('fruit') == 'orange') ), aggregations={ 'apple': aggregators.filtered( filters.Dimension('fruit') == 'apple', aggregators.thetasketch('person')), 'orange': aggregators.filtered( (filters.Dimension('fruit') == 'orange'), aggregators.thetasketch('person')), }, post_aggregations={ 'apple_&_orange': postaggregator.ThetaSketchEstimate( postaggregator.ThetaSketchSetOp( func='INTERSECT', fields=[ postaggregator.FieldAccess('apple'), postaggregator.FieldAccess('orange') ], name='final_unique_users_sketch' ) ), 'apple_&_not_orange': postaggregator.ThetaSketchEstimate( postaggregator.ThetaSketchSetOp( func='NOT', fields=[ postaggregator.FieldAccess('apple'), postaggregator.FieldAccess('orange') ], name='final_unique_users_sketch' ) ) } )
关键修正点
- 替换
ThetaSketchOp为ThetaSketchSetOp,完全对应JSON里的thetaSketchSetOp类型 - 操作符参数改用
func='NOT'(大写),匹配JSON中的func: "NOT"定义 - 用
postaggregator.FieldAccess来引用之前定义的聚合结果apple和orange,对应JSON里的fieldAccess逻辑
这样修改后,pydruid生成的查询结构会和你那套能跑通的JSON完全一致,就能得到预期的apple_&_not_orange结果啦!
内容的提问来源于stack exchange,提问作者Luke Vinton
相关产品推荐
相关产品推荐

