从 Array 展平 Snowflake 中的数据源
Flatten data source in Snowflake from Array
我正在尝试修复数据集中的数组。目前,我有一个数据集,该数据集具有多个不同 uuid 的参考号。我想做的是在 Snowflake 中将其展平,以便每个 uuid 的参考号都有单独的行。例如
Reference UUID
1) 9f823c2a-ced5-4dbe-be65-869311462f75 "[
""05554f65-6aa9-4dd1-6271-8ce2d60f10c4"",
""df662812-7f97-0b43-9d3e-12f64f504fbb"",
""08644a69-76ed-ce2d-afff-b236a22efa69"",
""f1162c2e-eeb5-83f6-5307-2ed644e6b9eb"",
]"
最终应该看起来像:
Reference UUID
1) 9f823c2a-ced5-4dbe-be65-869311462f75 05554f65-6aa9-4dd1-6271-8ce2d60f10c4
2) 9f823c2a-ced5-4dbe-be65-869311462f75 df662812-7f97-0b43-9d3e-12f64f504fbb
3) 9f823c2a-ced5-4dbe-be65-869311462f75 08644a69-76ed-ce2d-afff-b236a22efa69
4) 9f823c2a-ced5-4dbe-be65-869311462f75 f1162c2e-eeb5-83f6-5307-2ed644e6b9eb
我刚开始在 Snowflake 工作,所以我是新手。看起来有一个横向扁平化,但这要么没有告诉我我有各种各样的错误。雪花的文档在谈到这一点时有点令人困惑。
While FLATTEN
is the right approach when exploding an array, the UUID
column value shown in the original description is invalid if interpreted as JSON syntax: "[""val1"", ""val2""]"
并且在 LATERAL FLATTEN
方法可以通过将其视为 VARIANT
类型来应用之前需要更正。
如果您在原始描述中的数据样本是文字数据并适用于所有列值,那么以下查询将有助于将其转换为有效的 JSON 语法,然后应用横向展平以产生期望的结果:
SELECT
T.REFERENCE,
X.VALUE AS UUID
FROM (
SELECT
REFERENCE,
-- Attempts to transform an invalid JSON array syntax such as "[""a"", ""b""]"
-- to valid JSON: ["a", "b"] by stripping away unnecessary quotes
PARSE_JSON(REPLACE(REPLACE(REPLACE(UUID, '""', '"'), '["', '['), ']"', ']')) AS UUID_ARR_CLEANED
FROM TABLENAME) T,
LATERAL FLATTEN(T.UUID_ARR_CLEANED) X
如果您的数据已经是有效的 VARIANT
类型,并且在摄取期间对 UUID
列成功完成了 PARSE_JSON
,并且描述中提供的示例只是一种格式化只显示 JSON invalid in the post 的问题,那么与上面相同的查询的更简单版本就足够了:
SELECT REFERENCE, X.VALUE AS UUID
FROM TABLENAME, LATERAL FLATTEN(TABLENAME.UUID) X
我正在尝试修复数据集中的数组。目前,我有一个数据集,该数据集具有多个不同 uuid 的参考号。我想做的是在 Snowflake 中将其展平,以便每个 uuid 的参考号都有单独的行。例如
Reference UUID
1) 9f823c2a-ced5-4dbe-be65-869311462f75 "[
""05554f65-6aa9-4dd1-6271-8ce2d60f10c4"",
""df662812-7f97-0b43-9d3e-12f64f504fbb"",
""08644a69-76ed-ce2d-afff-b236a22efa69"",
""f1162c2e-eeb5-83f6-5307-2ed644e6b9eb"",
]"
最终应该看起来像:
Reference UUID
1) 9f823c2a-ced5-4dbe-be65-869311462f75 05554f65-6aa9-4dd1-6271-8ce2d60f10c4
2) 9f823c2a-ced5-4dbe-be65-869311462f75 df662812-7f97-0b43-9d3e-12f64f504fbb
3) 9f823c2a-ced5-4dbe-be65-869311462f75 08644a69-76ed-ce2d-afff-b236a22efa69
4) 9f823c2a-ced5-4dbe-be65-869311462f75 f1162c2e-eeb5-83f6-5307-2ed644e6b9eb
我刚开始在 Snowflake 工作,所以我是新手。看起来有一个横向扁平化,但这要么没有告诉我我有各种各样的错误。雪花的文档在谈到这一点时有点令人困惑。
While FLATTEN
is the right approach when exploding an array, the UUID
column value shown in the original description is invalid if interpreted as JSON syntax: "[""val1"", ""val2""]"
并且在 LATERAL FLATTEN
方法可以通过将其视为 VARIANT
类型来应用之前需要更正。
如果您在原始描述中的数据样本是文字数据并适用于所有列值,那么以下查询将有助于将其转换为有效的 JSON 语法,然后应用横向展平以产生期望的结果:
SELECT
T.REFERENCE,
X.VALUE AS UUID
FROM (
SELECT
REFERENCE,
-- Attempts to transform an invalid JSON array syntax such as "[""a"", ""b""]"
-- to valid JSON: ["a", "b"] by stripping away unnecessary quotes
PARSE_JSON(REPLACE(REPLACE(REPLACE(UUID, '""', '"'), '["', '['), ']"', ']')) AS UUID_ARR_CLEANED
FROM TABLENAME) T,
LATERAL FLATTEN(T.UUID_ARR_CLEANED) X
如果您的数据已经是有效的 VARIANT
类型,并且在摄取期间对 UUID
列成功完成了 PARSE_JSON
,并且描述中提供的示例只是一种格式化只显示 JSON invalid in the post 的问题,那么与上面相同的查询的更简单版本就足够了:
SELECT REFERENCE, X.VALUE AS UUID
FROM TABLENAME, LATERAL FLATTEN(TABLENAME.UUID) X