Есть ли возможность иметь другую метку времени в качестве измерения в друид?

Возможно ли иметь источник данных 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 и при необходимости преобразованы обратно при запросе временной ссылки.

Другие вопросы по тегам