python - 在 Redshift 中的单独行上返回 JSON 数组列的元素

标签 python postgresql amazon-redshift user-defined-functions

我有一个 Redshift 表,其中一列中有一个 JSON 数组:

 id | metadata
---------------------------------------------------------------------------
 1  | [{"pet":"dog","country":"uk"}, {"pet":"cat","country":"us"}]
 2  | [{"pet":"cat","country":"uk"}]
 3  | []

我想要一个如下所示的表格:

 id |   pet   |  country
------------------------
 1  | dog       | uk
 1  | cat       | us
 2  | cat       | uk

有没有办法在 Redshift 表上使用 sql 命令和/或 python 用户定义函数来执行此操作

最佳答案

我对 Redshift 使用这个(丑陋的)方法。令 seq 为具有单个字段 num 的表,其中包含从 1 到 10000 的数字(假设一行中的宠物不超过 10000 只)。您可以使用 generate_series(1, 10000),但由于奇怪的原因它速度较慢:(

select
  id,
  JSON_EXTRACT_PATH_TEXT(single_metadata, 'pet') as pet,
  JSON_EXTRACT_PATH_TEXT(single_metadata, 'country') as country
from
(
  select
    t.id,
    cast(JSON_EXTRACT_ARRAY_ELEMENT_TEXT(t.metadata, num) as json) as single_metadata
  from 
    t join seq -- or (select num from generate_series(1, 10000))
  on num <= json_array_length(t.metadata)
)

关于python - 在 Redshift 中的单独行上返回 JSON 数组列的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59713001/

相关文章:

database - Redshift 光谱 - 更新外部光谱表列类型

sql - 在 Redshift 中执行 WHERE IN 或 INNER JOIN 更快吗

python - Tkinter 全屏

python - 测试 xml.etree.ElementTree 的等价性

json - PostgreSQL - 在一列中返回 jsonb 键

php - 我有 2 个问题,同样的 PHP 和 pgsql 查询

postgresql - 如何用 GROUP BY 子句消除重复的字段?

sql - 亚马逊 Redshift 并发写入导致插入记录,导致重复

python - Altair 复选框默认值

python,使用if循环确保用户输入是数字然后操作数字