本文档介绍如何通过资源函数从RDS-MySQL中获取数据对日志数据进行富化。

假设RDS中存放用户信息表格userinfo如下:
id province city uid
1 jiangsu nanjing 01234
2 henan zhengzhou 01235
3 heilongjiang haerbin 01236
4 jiangsu yantai 01237

定期刷新全量获取

假设富化数据定期全量刷新,如果希望数据加工任务能够自动定期去获取,可以如下配置。
res_rds_mysql(..., refresh_interval=300)
上述语法会返回一个表格结构并且会自动跟踪表格,每隔5分钟重新获取一遍mysql表的内容并刷新这个表格内容。

获取部分数据

如果仅使用RDS-MySQL中个别字段做富化,推荐使用参数tablesqlfields来进行行或者列过滤。这样可以降低维表大小,增加富化效率。

如下进行列过滤,值选择cityuid列,两者效果没有任何区别。
res_rds_mysql(..., sql="select city, uid from userinfo")      # 列过滤
res_rds_mysql(..., table="userinfo", fields=["city", "uid"])    # 列过滤
如下使用sql进行列与行过滤,选择所有uid > 1234的数据。
res_rds_mysql(..., sql="select * from userinfo where uid > 1234")   # 行过滤
res_rds_mysql(..., sql="select city, uid from userinfo where uid > 1234")   # 行列过滤

获取后再过滤数据

在使用参数tablesqlfields来进行行或者列过滤不能满足需求时,可以进一步使用参数fetch_exclude_data/fetch_include_data来进行行过滤。例如:
res_rds_mysql(..., fetch_include_data="uid==0123*")    # 保留所有uid以0123开头的数据
res_rds_mysql(..., fetch_exclude_data="uid < 1234")    # 去除所有uid小于1234的数据
res_rds_mysql(..., fetch_include_data="city:n", fetch_exclude_data="uid < 1234")
以上注释解释了两者的区别,注意到这里两个参数的格式都是查询字符串。
同时配置fetch_exclude_datafetch_include_data,会优先执行fetch_exclude_data将不符合的数据剔除,然后执行fetch_include_data将符合的数据添加进来。uid大于等于1234且以city包含字母n的所有数据做维表。
说明 这种过滤是获取数据到本地后再进行过滤,因此效率没有参数tablesqlfields过滤高。

调整返回表格结构

默认返回的表格与RDS-MySQL中的表格结构一致,如果需要调整,例如将province字段改成prov等,可以使用如下方法。
res_rds_mysql(..., sql="select id, uid, province as prov, city from userinfo")
res_rds_mysql(..., table="userinfo", fields=["id", "uid", ("province", "prov"), "city" ])

两个方法效果相同。关于fields参数请参见资源函数

结合e_table_map和e_search_map_table做数据富化实践

说明 res_rds_mysql函数在控制台上单独使用没有任何意义,因为该函数只是去mysql获取数据,并没有做任何富化的操作。下面将详细介绍使用res_rds_mysql函数做富化的几个函数用法。
  • 使用e_table_map完全匹配。
    • 假设如下数据库表中内容:
      province city population cid eid
      上海 上海 2000 1 00001
      天津 天津 800 1 00002
      北京 北京 4000 1 00003
      河南 郑州 3000 2 00004
      江苏 南京 1500 2 00005
    • 源Logstore中数据:
      # 下图为4条日志
      time:"1566379109"
      data:"test-one"
      cid:"1"
      eid:"00001"
      
      time:"1566379111"
      data:"test_second"
      cid:"1"
      eid:"12345"
      
      time:"1566379111"
      data:"test_three"
      cid:"2"
      eid:"12345"
      
      time:"1566379113"
      data:"test_four"
      cid:"2"
      eid:"12345"
      
      ......
    • 匹配mysql表中cid的数据,并且将provice等字段添加到源Logstore 中。
      # DSL 编排语法
      # 该语法会将mysql表中cid的值和logstore数据中cid的值完全相等的行的"provice","city","population"三个字段的值添加到源logstore的数据中,组成新的数据
      e_table_map(res_rds_mysql(...),"cid",["provice","city","population"])
    • 使用规则后产生新数据:
      # 下图为4条日志
      time:"1566379109"
      data:"test-one"
      cid:"1"
      eid:"00001"
      provice:"上海"
      city:"上海"
      population:"2000"
      
      time:"1566379111"
      data:"test_second"
      cid:"1"
      eid:"12345"
      provice:"上海"
      city:"上海"
      population:"2000"
      
      time:"1566379111"
      data:"test_three"
      cid:"2"
      eid:"12345"
      provice:"河南"
      city:"郑州"
      population:"3000"
      
      time:"1566379113"
      data:"test_four"
      cid:"2"
      eid:"12345"
      provice:"河南"
      city:"郑州"
      population:"3000"
      
      ......
      说明 在对数据库表中数据的cid的值进行等值匹配的时候,有多个cid值为1的行,但是我们只获取匹配到第一行的数据,对后续的数据并没有进行处理,这就是当前e_table_map的规则特点。首先要单个或多个字段的等值匹配,其次e_table_map规则目前只支持匹配一行数据结果。后续我们会支持多行匹配的形式,目前如果想要使用多行匹配,将匹配到的所有数据组合成新的数据,e_search_table_map可以解决这个问题。
  • 使用e_search_table_map进行字符串搜索匹配以及多行匹配。
    • 源Logstore原始日志数据:
      time:1563436326
      data:123
      city:nanjing
      province:jiangsu
    • MYSQL 数据库表中数据:
      content name age
      city~=n* aliyun 10
      province~=su$ Maki 18
      city:nanjing vicky 20
    • ETL加工编排。

      根据指定的mysql表中的字段的值去匹配原始日志,其中指定mysql字段的值为key/value形式,value为正则表达式,key为匹配原始日志中字段的值。根据匹配结果,将mysql指定字段的值添加到原始日志中,支持多行匹配,将多个值添加到原始日志的一个字段中。

    • 样例一:单行匹配,匹配到mysql表中一行就返回,不会继续匹配。
      e_search_table_map(res_rds_mysql(address="rds-host", username="mysql-username",password="xxx",database="xxx",table="xx",refresh_interval=60),"content","name")
      说明
      • 使用了e_search_table_map语法,详细请参见e_search_table_map
      • res_rds_mysql()里填入的是从RDS MYSQl获取数据的配置,该函数会获取指定的mysql表格,具体语法请参见res_rds_mysql
      • content字段指定的是mysql表中的字段,会使用该字段的值的内容去匹配原始日志中的内容,具体匹配规则请参见e_search,支持正则、完全匹配、模糊匹配等形式。

      DSL 编排结果:

      匹配查找原始日志中以n开头的city字段的值,找到后将表中的name字段的值添加到原始日志中。
      time:1563436326
      data:123
      city:nanjing
      province:jiangsu
      name:aliyun
    • 样例二:多行匹配,遍历mysql表中所有行,将匹配到的数据,添加到指定字段中。
      在参数中添加了multi_match=Truemulti_join=","两个字段,分别表示开启多行匹配,匹配到多个值时使用逗号进行组合,使用该语法会将匹配到的所有行的内容进行添加。
      e_search_table_map(res_rds_mysql(address="rds-host", username="mysql-username",password="xxx",database="xxx",table="xx",refresh_interval=60),"content","name",multi_match=True,multi_join=",")

      DSL 编排结果:

      该语法会分别按照符合e_search规则的方式去查找city=n*province=su$city:nanjing,其中~=后面是正则表达式,冒号:表示是否包含该字段的用法。mysql表中按照规则分别匹配中三行,所以将三个name值按照逗号分隔添加到原始日志中。
      time:1563436326
      data:123
      city:nanjing
      province:jiangsu
      name:aliyun,Maki,vicky