如何使用KSQL计算DAU / MAU?

时间:2019-10-03 09:58:48

标签: etl ksql stream-processing

我是Messenger开发人员,并尝试使用KSQL使用用户请求的事件流来计算DAU / MAU。

我尝试使用以下查询进行计算:

CREATE TABLE ACTIVE_USER_ACTIONS_BY_1_HOUR WITH (
  KAFKA_TOPIC='active-user-actions-by-1-hour'
) AS
SELECT 
  MCCU.UID AS UID,
  COUNT(MCCU.UID) AS ACTIVITY_COUNT
FROM METRICS_REQUESTS MR
JOIN METRICS_CONTEXT_CID_UID MCCU ON MCCU.CID = MR.CID
WINDOW TUMBLING (SIZE 1 HOUR)
WHERE
  MR.REQ_NAME = 'SendMessage' OR
  MR.REQ_NAME = 'UpdateMessage'
GROUP BY MCCU.UID;

我得到以下结果:

{
  "order": 3,
  "ROWTIME": 1570095657670,
  "ROWKEY": "1365010623 : Window{start=1570093200000 end=-}",
  "UID": 1365010623,
  "ACTIVITY_COUNT": 3
}
{
  "order": 1,
  "ROWTIME": 1570095651905,
  "ROWKEY": "1637035978 : Window{start=1570093200000 end=-}",
  "UID": 1637035978,
  "ACTIVITY_COUNT": 9
}

不了解如何将这些行映射为类似的内容:

{
    "ACTIVE_UID_COUNT": 2,
    "START": 1570093200000,
    "END": null
}

1 个答案:

答案 0 :(得分:0)

如果要计算DAU / MAU,则必须使用TOPKDISTINCT函数,该函数仅计算传入事件中user_id的不同出现次数。 您应该使用如下的sql代码:

CREATE TABLE dau_1min WITH (KAFKA_TOPIC='dau-1m', VALUE_FORMAT='AVRO') AS
SELECT
  country,
  WINDOWSTART() AS window_timestamp,
  ARRAYLENGTH(TOPKDISTINCT(user_id, 10000000)) AS dau
FROM eventssource
WINDOW TUMBLING (SIZE 1 MINUTE)
GROUP BY country;

当TOPKDISTINCT返回不同标识符的ARRAY时,您必须实现自定义UDF函数,即ARRAYLENGTH仅返回给定数组的大小。 之后,您将获得一个像{country,window_timestamp,dau}这样的对象,它很简单,可以存储在某些持久性数据库中,例如pqsql。