我是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
}
答案 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。