Есть ли возможность иметь другую метку времени в качестве измерения в друид?
Возможно ли иметь источник данных Druid с 2 (или несколькими) временными картами в нем? Я знаю, что Druid - это БД, основанная на времени, и у меня нет проблем с этой концепцией, но я хотел бы добавить другое измерение, с которым я могу работать, как с меткой времени
например, удержание пользователя: метрика, безусловно, указана на определенную дату, но мне также нужно создать когорты на основе даты регистрации пользователей и свести эти даты к неделям, месяцам или отфильтровать только до определенных периодов времени....
Если функциональность не поддерживается, есть ли плагины? Есть грязные решения?
4 ответа
Хотя я предпочел бы дождаться официальной реализации для полной поддержки измерений временных меток в друиде, я нашел "грязный" хак, который я искал.
Схема источника данных
Перво-наперво, я хотел знать, сколько пользователей вошли в систему за каждый день, с возможностью агрегирования по датам / месяцам / годам
вот схема данных, которую я использовал:
"dataSchema": {
"dataSource": "ds1",
"parser": {
"parseSpec": {
"format": "json",
"timestampSpec": {
"column": "timestamp",
"format": "iso"
},
"dimensionsSpec": {
"dimensions": [
"user_id",
"platform",
"register_time"
],
"dimensionExclusions": [],
"spatialDimensions": []
}
}
},
"metricsSpec": [
{ "type" : "hyperUnique", "name" : "users", "fieldName" : "user_id" }
],
"granularitySpec": {
"type": "uniform",
"segmentGranularity": "HOUR",
"queryGranularity": "DAY",
"intervals": ["2015-01-01/2017-01-01"]
}
},
поэтому пример данных должен выглядеть примерно так (каждая запись является событием входа в систему):
{"user_id": 4151948, "platform": "portal", "register_time": "2016-05-29T00:45:36.000Z", "timestamp": "2016-06-29T22:18:11.000Z"}
{"user_id": 2871923, "platform": "portal", "register_time": "2014-05-24T10:28:57.000Z", "timestamp": "2016-06-29T22:18:25.000Z"}
Как вы можете видеть, моя "основная" временная метка, для которой я вычисляю эти метрики, является полем временной метки, где register_time - это только размерность в виде строки - формат ISO 8601 UTC.
Агрегирование
А теперь самое интересное: я смог агрегировать по меткам времени (дата) и register_time (снова дата) благодаря функции извлечения формата времени
Запрос выглядит так:
{
"intervals": "2016-01-20/2016-07-01",
"dimensions": [
{
"type": "extraction",
"dimension": "register_time",
"outputName": "reg_date",
"extractionFn": {
"type": "timeFormat",
"format": "YYYY-MM-dd",
"timeZone": "Europe/Bratislava" ,
"locale": "sk-SK"
}
}
],
"granularity": {"timeZone": "Europe/Bratislava", "period": "P1D", "type": "period"},
"aggregations": [{"fieldName": "users", "name": "users", "type": "hyperUnique"}],
"dataSource": "ds1",
"queryType": "groupBy"
}
фильтрация
Решение для фильтрации основано на функции извлечения JavaScript, с помощью которой я могу преобразовать дату во время UNIX и использовать ее внутри (например) связанного фильтра:
{
"intervals": "2016-01-20/2016-07-01",
"dimensions": [
"platform",
{
"type": "extraction",
"dimension": "register_time",
"outputName": "reg_date",
"extractionFn": {
"type": "javascript",
"function": "function(x) {return Date.parse(x)/1000}"
}
}
],
"granularity": {"timeZone": "Europe/Bratislava", "period": "P1D", "type": "period"},
"aggregations": [{"fieldName": "users", "name": "users", "type": "hyperUnique"}],
"dataSource": "ds1",
"queryType": "groupBy"
"filter": {
"type": "bound",
"dimension": "register_time",
"outputName": "reg_date",
"alphaNumeric": "true"
"extractionFn": {
"type": "javascript",
"function": "function(x) {return Date.parse(x)/1000}"
}
}
}
Я пытался отфильтровать его "напрямую" с помощью фильтра javascript, но мне не удалось убедить друида вернуть правильные записи, хотя я дважды проверил его с помощью различных реплик JavaScript, но, эй, я не эксперт по JavaScript.
К сожалению, у Друида есть только один столбец отметок времени, который можно использовать для объединения, плюс в настоящее время друид рассматривает все остальные столбцы как строки (конечно, кроме метрик), поэтому вы можете добавить еще один строковый столбец со значениями отметки времени, но это единственное Вы можете сделать с ним фильтрацию. Я думаю, вы могли бы взломать это таким образом. Надеемся, что в будущем друид разрешит использовать другой тип столбцов, и, возможно, отметка времени будет одной из них.
Другое решение - добавить метрику longMin для метки времени и сохранить время эпохи в этом поле, или вы преобразуете дату и время в число и сохраните его (например, 31 марта 2021 года с 08:00 до 310320210800)
Что касается Druid 0.22, в документации указано, что вторичные временные метки должны обрабатываться / анализироваться как измерения типа long. Вторичные временные метки могут быть преобразованы в длинные во время приема с помощью tranformSpec и при необходимости преобразованы обратно при запросе временной ссылки.