嗨,我用以下值创建了以下流,
“ account_id VARCHAR,user_id VARCHAR,src_ip VARCHAR,country_code VARCHAR,消息VARCHAR”
现在,我可以在给定的滚动窗口内创建一个仅具有特定account_id匹配字段的表,如下所示,
CREATE TABLE 221_console_failure AS \
SELECT user_id, country_code \
FROM my_stream \
WINDOW TUMBLING (SIZE 600 SECONDS) \
WHERE account_id = '4894833322'
有什么方法可以找到同一用户在10分钟内是否从不同的国家/地区代码值登录
我的country_code字段包含IN,US,SG等值。
答案 0 :(得分:2)
对于您的用例,您可以使用HISTOGRAM来解决,直到KSQL提供DISTINCT函数为止。
HISTOGRAM(col1)(输入类型:STREAM / TABLE):返回一个映射,其中包含col1的不同String值,该值映射到给定窗口每次出现的次数。此版本将可计数的不同值的数量限制为1000,超过此数量的所有其他条目将被忽略。
CREATE TABLE 221_console_failure AS \
SELECT user_id, \
HISTOGRAM(country_code) as region, count(*)
FROM my_stream \
WINDOW TUMBLING (SIZE 600 SECONDS) \
WHERE user_account_id = '4894833322' \
GROUP BY user_account_id;
Output at consumer: b'{"USER_ID":"4894833322","REGION":{"SG":2,"IN":3},"KSQL_COL_2":5}'
现在,您可以在REGION检查地图长度> 1,因为它会收集不同的值。
如果您具有经度和纬度,也可以尝试使用标量函数GEO_DISTANCE(lat1, lon1, lat2, lon2, unit)
。
KSQL - calculate distance from 2 messages using GEO_DISTANCE
答案 1 :(得分:0)
KSQL尚不支持COUNT(DISTINCT)
,这是您在这里需要的,以便能够运行它:
SELECT USER_ID, COUNT(DISTINCT COUNTRY_CODE) \
FROM USER_EVENTS WINDOW TUMBLING (SIZE 10 MINUTES) \
GROUP BY USER_ID \
HAVING COUNT(DISTINCT COUNTRY_CODE) > 1;
如果此功能对您有用,请随时对https://github.com/confluentinc/ksql/issues/506进行投票/评论。