我的要求是在 redshift 上创建一个物化视图,其中包含嵌套 Dynamodb JSON 格式的扁平化数据。我已经尝试了 AWS 提供的大部分方法以及创建函数或存储过程,但没有一个为我提供正确的结果。我的问题是有人可以帮助使用 redshift 上的物化视图从列中的给定格式中提取数据 以下是 dynamodb json 格式的示例。
{ “姓名”: { “L”: [ { “M”: { “字段1”:{ “s”:“正确” }, “字段2”:{ “s”:“假” }, “字段3”:{ “s”:“正确” } } } ] } }
需要在列中提取字段Field1、Field2、Field3。 PS:如果json格式错误,请指正
json_parse、json_extract_path_text、unpivot 等。我已经尝试了大多数方法,但没有任何效果
我现在明白了这种困惑。您需要使用 JSON_EXTRACT_PATH_TEXT() 来解析命名的 json 键,但需要使用 JSON_EXTRACT_ARRAY_ELEMENT_TEXT() 来解析 json 数组。您需要结合这些来提取您想要的信息(请参阅下面的 json_parse 方法)。
您的示例应如下所示:
select JSON_EXTRACT_PATH_TEXT(
JSON_EXTRACT_ARRAY_ELEMENT_TEXT(
JSON_EXTRACT_PATH_TEXT('{ "Name": { "L": [ { "M": { "Field1":{ "s": "TRUE" }, "Field2":{ "s": "FALSE" }, "Field3":{ "s": "TRUE" } } } ] } }', 'Name', 'L')
, 0),
'M', 'Field1', 's')
AS col_a;
因为 DynamoDB 使用大量嵌套,您需要大量解析字符串。
或者,您可以使用 Redshift 的超级数据类型来保存值和内部导航功能来执行您想要的操作。这样做的好处是能够表示 json 的数组元素中的多个值(上面的解决方案只获取数组的第一个元素)。在下面的代码中,我将您的示例扩展为在数组“L”中包含 2 个元素,并且此代码将提取 Field1 的两个值。对于此代码,Redshift 将为每个数组元素创建一行,无论有多少个。另请注意,由于您的 json 键包含大写字符,我们需要将 Redshift 设置为区分大小写才能解析这些字符。
SET enable_case_sensitive_identifier TO true;
with jsub as (
select JSON_PARSE('{ "Name": { "L": [ { "M": { "Field1":{ "s": "TRUE" }, "Field2":{ "s": "FALSE" }, "Field3":{ "s": "TRUE" } } },
{ "M": { "Field1":{ "s": "FALSE" }, "Field2":{ "s": "TRUE" }, "Field3":{ "s": "FALSE" } } } ] } }')::super as j
),
jname as (
select s.j , j."Name"."L" list
from jsub s
)
select s.j, index, a."M"."Field1"."s"
from jname s, s."list" a at index;