如何编写KSQL查询以区分特定用户的区域ID

时间:2019-02-06 08:50:59

标签: ksql

嗨,我用以下值创建了以下流,

“ 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等值。

2 个答案:

答案 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进行投票/评论。