如何在Snowflake中查询多个JSON文档模式



有人能告诉我如何更改下面文章中的存储过程,以递归扩展json文件(多个json文档模式(的所有属性吗?

https://support.snowflake.net/s/article/Automating-Snowflake-Semi-Structured-JSON-Data-Handling-part-2

Craig Warman在博客中发布的存储过程是个不错的主意。我问他是否可以重构他的代码,他同意了。我在现场使用过重构版本,所以我很了解SP及其工作原理。

可以修改SP以处理JSON。这将取决于Snowflake是否在您的变体列中键入JSON。按照你的结构,它可能不会键入所有内容。您可以通过运行此SQL并查看结果集是否包含您需要的所有列来进行检查:

set VARIANT_TABLE = 'WEATHER';
set VARIANT_COLUMN = 'V';
with MAIN_TABLE as
(
select * from identifier($VARIANT_TABLE) sample (1000 rows)
)
select distinct REGEXP_REPLACE(REGEXP_REPLACE(f.path, '\[(.+)\]'),'[^a-zA-Z0-9]','_') AS path_name,       -- This generates paths with levels enclosed by double quotes (ex: "path"."to"."element").  It also strips any bracket-enclosed array element references (like "[0]")
typeof(f.value)                                                         AS attribute_type,  -- This generates column datatypes.
path_name                                                               AS alias_name       -- This generates column aliases based on the path
from
MAIN_TABLE,
LATERAL FLATTEN(identifier($VARIANT_COLUMN), RECURSIVE=>true) f
where   TYPEOF(f.value) != 'OBJECT'
AND NOT contains(f.path, '[');

请确保将变量替换为表名和列名。如果这获取了JSON中列的类型信息,则可以修改此SP以执行所需操作。如果没有,但有一种方法可以修改查询,让它拾取列,这也会起作用。

如果它没有选择列,基于Craig的想法,我决定为非变体(例如没有类型信息的CSV日志文件中的字符串(编写类型推断。请先尝试上面的SQL,看看结果如何。

最新更新