BigQuery如何拆分值含空格且无需硬编码键的键值对日志数据
解决方案
核心逻辑:你的日志键值对的分界是[键名]=的格式,值部分可以包含任意字符,直到下一个[键名]=出现或者行结束,用这个规律做正则匹配就能避开值内空格的干扰,不需要硬编码任何键名。
你可以直接使用如下可运行的BigQuery SQL代码实现解析:
SELECT -- 把提取到的键值对数组转成JSON对象,方便后续按键取值 json_object( array(select kv[offset(0)] from unnest(kv_pairs) kv), array(select kv[offset(1)] from unnest(kv_pairs) kv) ) as parsed_log FROM ( SELECT -- 正则两个捕获组分别匹配键名、值,前瞻断言判断值的结束边界 regexp_extract_all(details, r'(\w+)=([^=]+?(?=\s+\w+=|$))') as kv_pairs FROM ( SELECT 'rt=Aug 19 2021 00:00:02 UTC+00:00 shost=dns.google src=8.8.8.8' details ) )
运行后parsed_log的输出结果为:
{"rt":"Aug 19 2021 00:00:02 UTC+00:00","shost":"dns.google","src":"8.8.8.8"}
后续需要取对应键的值直接用JSON_VALUE(parsed_log, '$.rt')这类写法即可,不需要提前硬编码所有键名拆分多列。
如果确实需要自动把所有键展开为独立列,可以结合动态SQL实现:
- 先批量统计所有日志中出现过的全部键名
- 拼接生成动态SQL语句,用JSON_VALUE提取每个键对应的值作为单独列
- 执行生成的动态SQL即可,不需要手动维护键名列表
内容的提问来源于stack exchange,提问作者Coastie
相关产品推荐
相关产品推荐

