Я запрашиваю базу данных druid с помощью pydruid и хочу вычислить результаты после агрегации, где одна агрегация истинна, а другая ложна.
Мне удалось вычислить результат после агрегирования, используя curl для отправки запроса в формате JSON в базу данных druid.
Используя пидруид, я смог рассчитать начальные агрегации и постагрегацию пересечения двух групп агрегатов. Я попытался найти способ использовать класс ThetaSketchOp для своих целей, но пока безуспешно.
Вот моя попытка использовать класс ThetaSketchOp в pydruid:
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.ThetaSketch('apple') &
postaggregator.ThetaSketch('orange')
),
'apple_&_not_orange': postaggregator.ThetaSketchEstimate(
postaggregator.ThetaSketchOp(
fn='not',
fields=[
postaggregator.ThetaSketch('apple'),
postaggregator.ThetaSketch('orange')
],
name='testing'
)
)
}
)
Вот запрос в формате json, который дает желаемый результат при использовании для запроса к базе данных druid:
{
"queryType": "groupBy",
"dataSource": "datasource",
"granularity": "ALL",
"dimensions": [],
"aggregations": [
{
"type" : "filtered",
"filter" : {
"type" : "selector",
"dimension" : "fruit",
"value" : "apple"
},
"aggregator" : {
"type": "thetaSketch", "name": "apple", "fieldName": "person"
}
},
{
"type" : "filtered",
"filter" : {
"type" : "selector",
"dimension" : "fruit",
"value" : "orange"
},
"aggregator" : {
"type": "thetaSketch", "name": "orange", "fieldName": "person"
}
}
],
"postAggregations": [
{
"type": "thetaSketchEstimate",
"name": "apple_&_orange",
"field":
{
"type": "thetaSketchSetOp",
"name": "final_unique_users_sketch",
"func": "INTERSECT",
"fields": [
{
"type": "fieldAccess",
"fieldName": "apple"
},
{
"type": "fieldAccess",
"fieldName": "orange"
}
]
}
},
{
"type": "thetaSketchEstimate",
"name": "apple_&_not_orange",
"field":
{
"type": "thetaSketchSetOp",
"name": "final_unique_users_sketch",
"func": "NOT",
"fields": [
{
"type": "fieldAccess",
"fieldName": "apple"
},
{
"type": "fieldAccess",
"fieldName": "orange"
}
]
}
}
],
"intervals": [ "2018-06-30T23:00:05.000Z/2019-07-01T17:00:05.000Z" ]
}
Спасибо за чтение. Пожалуйста, дайте мне знать, если есть какая-либо другая информация, которую я должен предоставить.