代码之家  ›  专栏  ›  技术社区  ›  Naggappan Ramukannan

如何编写ksql查询来为特定用户分配区域id

  •  0
  • Naggappan Ramukannan  · 技术社区  · 6 年前

    嗨,我创建了一个具有以下值的跟踪流,

    “account_id varchar,user_id varchar,src_ip varchar,country_code varchar,message varchar”

    现在我可以在给定的滚动窗口中创建一个只有特定帐户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分钟内从不同的国家代码值登录,是否有任何方法可以找到

    “我的国家代码”字段包含值,如in、us、sg等。

    2 回复  |  直到 6 年前
        1
  •  2
  •   Shakeel    6 年前

    对于您的用例,可以使用直方图作为解决方法,直到ksql提供不同的功能。

    直方图(col1)(输入类型:stream/table):返回一个映射,其中包含col1的不同字符串值,映射到给定窗口中每个字符串出现的次数。此版本将可计数的不同值的数目限制为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}'
    

    现在,您只需在区域中检查“地图长度”1,因为它会收集不同的值。

    也可以尝试使用标量函数 GEO_DISTANCE(lat1, lon1, lat2, lon2, unit) 如果你有经纬度。 KSQL - calculate distance from 2 messages using GEO_DISTANCE

        2
  •  0
  •   Robin Moffatt    6 年前

    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 如果这个功能对你有用的话。

    推荐文章