如何使用jq在Firehose聚合事件中提取元数据并实现动态分区?
Firehose聚合事件拆分问题及解决
问题情况
我在Firehose中处理聚合事件时,用以下jq查询提取键值对时触发错误:
id:.id users:users[].uuid
错误提示:
Error: metadata extraction failed because JQ query failed. invalid jq query causing a single record to split into 2 or more.
输入的聚合事件数据(注:原始JSON存在语法错误,键值对间缺少逗号,需修正后才能正常解析):
{ "id":20 "users": [ { "uuid":2330 "first": "Stevie", "last": "Wonder" }, { "uuid":9033131 "first": "Michael", "last": "Jackson" } ] } { "id":30 "users": [ { "uuid":984209302 "first": "lower", "last": "harvest" }, { "uuid":8980323932 "first": "Duncan", "last": "mighty" } ] }
期望输出是按uuid拆分每个用户为独立记录,格式如下:
{ "id":20, "users": [ { "uuid":2330, "first": "Stevie", "last": "Wonder" } ] }, { "id":20, "users": [ { "uuid":9033131, "first": "Michael", "last": "Jackson" } ] }, { "id":30, "users": [ { "uuid":984209302, "first": "lower", "last": "harvest" } ] }
解决方法
错误原因
你用的查询里users[].uuid会把每个用户的uuid单独输出,导致单条输入记录被拆分成多条,违反了Firehose的处理规则,所以报错。要实现按uuid拆分,得保留每个用户的完整信息,同时为每个用户生成带原id的独立记录。
正确jq语句
. as $parent | .users[] | {id: $parent.id, users: [.]}
语句说明
. as $parent:把当前整个输入对象(包含id和users数组)存到变量$parent,后续用来引用原记录的id。.users[]:遍历users数组里的每一个用户对象。{id: $parent.id, users: [.]}:为每个用户生成新记录,id沿用原记录的id,users字段是只包含当前用户的数组,完全匹配你要的输出格式。
额外提示
先修正输入JSON的语法错误,确保键值对之间都有逗号,否则jq无法正常解析数据。
内容的提问来源于stack exchange,提问作者Tolu
相关产品推荐
相关产品推荐

