sql - 使用 split 或 regex 解析 bigquery 中的数据
问题描述
我在 platforminfo 列中有这种数据
[{'df':{},'badKs':['+81312277629'],'objectId':'JoF3NUHVYxDAoirH4e6i3g','平台':'Web'},{'df':{},'badKs':[ '+81312277629'],'objectId':'-vfa995e3b5d384b7dbfd8919bad17c28a','平台':'iOS','os_version':'14.1','app_version':'3.16.2','make':'Apple','型号': 'iPhone12,3'}]
[{'df': {}, 'objectId': 'elQ8JEW2klEQFMZ0vXZDhw', 'platform': 'Web', 'phone': 5370002731}, {'df': {}, 'objectId': '__da533f19d1e040bea2b2b58fa6d2ecad', 'platform ':'Android','手机':5370002731,'os_version':'10','app_version':'3.6.4','make':'三星','型号':'SM-A605G'}]
我想要的是将此数据解析为许多列,但实际上定义相同但命名不同 badKs=phone
我的期望是这样的:
phone platform os_version make
+81312277629 iOS 14.1 Apple
5370002731 Android 10 Samsung
我已经用这个查询做了
split(REGEXP_REPLACE(platforminfo, r'([\{\}\]\'\"])', ''), 'phone:')[SAFE_OFFSET(ARRAY_LENGTH(SPLIT(platforminfo, ']')) - 1)] end
但是,此查询不足以解析数据,如果您能在这种情况下帮助我,将会很有帮助。谢谢
解决方案
使用以下方法
select
translate(coalesce(json_extract(el[offset(0)], '$.badKs'), json_extract(el[offset(0)], '$.phone')), "[]\"", "") as phone,
json_extract_scalar(el[offset(1)], '$.platform') as platform,
json_extract_scalar(el[offset(1)], '$.os_version') as os_version,
json_extract_scalar(el[offset(1)], '$.make') as make
from `project.dataset.table`, unnest([struct(json_extract_array(platforminfo, '$') as el)])
如果应用于您问题中的样本数据 - 输出是
推荐阅读
- spring-security - 想要自定义 ExpressionInterceptURL 来动态管理对 URL 的访问
- ajax - 编辑帖子上的错误在 Ajax 调用中显示 422(无法处理的实体)
- java - 这个 Junit 测试是否有效?
- c - ocamlopt:链接期间出错
- sql - 错误 3167 - 运行附加查询时“记录已删除”。访问 2010
- javascript - 为什么我无法通过 SocketIO 发送 Express 的响应对象?
- matlab - 解释“在 Matlab 中为 Mandelbrot 集着色”第 13 行
- ruby-on-rails - ruby on rails 嵌套表单创建
- html - IntelliJ 更改语言模式与 VS Code 相同
- c++ - 使用无序集检查等值图 C++