amazon-redshift - RedShift:嵌套 json 的一些问题
问题描述
我有下一个 JSON:
{"promptnum":4,"corpuscode":"B0014","prompttype":"video","skipped":false,"transcription":"1","deviceinfo":{"DEVICE_ID":"exynos980","DEVICE_MANUFACTURER":"samsung","DEVICE_SERIAL":"unknown","DEVICE_DESIGN":"a51x","DEVICE_MODEL":"SM-A5160","DEVICE_OS":"android","DEVICE_OS_VERSION":"10","DEVICE_CARRIER":"","DEVICE_BATTERY_LEVEL":"70.00%","DEVICE_BATTERY_STATE":"unplugged","Current App Version":"1.1.0","Current App Build":"6"}}
我想从 1 级和 2 级获取值。
第一级:"promptnum":4,"corpuscode":"B0014","prompttype":"video","skipped":false,"transcription":"1","deviceinfo":...
2级:
"deviceinfo":{"DEVICE_ID":"exynos980","DEVICE_MANUFACTURER":"samsung","DEVICE_SERIAL":"unknown","DEVICE_DESIGN":"a51x","DEVICE_MODEL":"SM-A5160","DEVICE_OS":"android","DEVICE_OS_VERSION":"10","DEVICE_CARRIER":"","DEVICE_BATTERY_LEVEL":"70.00%","DEVICE_BATTERY_STATE":"unplugged","Current App Version":"1.1.0","Current App Build":"6"}
当我用
SELECT d.*
FROM (
SELECT c.json_parse, c.json_parse.deviceinfo AS device_info
FROM (
SELECT JSON_PARSE(file_attr)
FROM public.dc_ac_files
) AS c) AS d
它运作良好。
但是当我尝试从第二级获取值时
SELECT d.*, l.DEVICE_ID
FROM (
SELECT c.json_parse, c.json_parse.deviceinfo AS device_info
FROM (
SELECT JSON_PARSE(file_attr)
FROM public.dc_ac_files
) AS c) AS d, d.device_info AS l
它不起作用 - 没有错误,也没有数据。
如果我知道,这是解析嵌套 json 的正确方法,但它对我不起作用。
你能帮助我吗?
解决方案
维克多,你有几个问题。首先,符号“AS d, d.device_info AS l”用于在您的超级数据中取消嵌套数组。您没有任何要取消嵌套的数组,因此这将返回零行。
对于所有列名,第二个 Redshift 默认为小写,因此 DEVICE_ID 被视为 device_id。您可以通过将 enable_case_sensitive_identifier 连接变量设置为 true 并引用所有需要大写字符的列名来启用区分大小写的列名。“将 enable_case_sensitive_identifier 设置为 true;” 并将 l.DEVICE_ID 更改为 l."DEVICE_ID"。
您的查询中还有不需要的图层。
将所有这些放在一起,您可以运行:
SELECT l, l.deviceinfo, l.deviceinfo."DEVICE_ID"
FROM (
SELECT JSON_PARSE(file_attr) AS l
FROM public.dc_ac_files
) AS c
您也不需要 SUPER 数据类型来执行此操作。这可以通过 json 字符串解析函数来完成。
SELECT file_attr, json_extract_path_text(file_attr, 'deviceinfo') as deviceinfo, json_extract_path_text(file_attr, 'deviceinfo','DEVICE_ID') as device_id
FROM public.dc_ac_files
推荐阅读
- javascript - eslint 警告文件被忽略,即使我特别忽略了它。我可以禁用这个吗?
- c++ - OpenGL:混合和反馈效果
- prolog - Prolog中Result的形式
- python - python中的时间格式化与sys模块相结合
- python - Huggingface 错误:AttributeError:“ByteLevelBPETokenizer”对象没有属性“pad_token_id”
- powershell - Get-Msoluser 接受硬编码字符串,但不接受参数 UserPrincipalName 的变量
- javascript - Nivo d3 react chart - 如何为 nivo 图表设置 bin 大小和 y 轴
- android - 数据绑定自定义适配器可见性
- python - 在负面情绪分析中添加“-”号
- node.js - 使用 Jest 和 Typescript 在 Node.js 中模拟和取消模拟“node-fetch”模块的正确方法是什么?