snowflake-cloud-data-platform - Snowflake - 使目标表模式与源表变量列值保持同步
问题描述
我将数据摄取到source_table
带有 AVRO 数据的表中。此表中有一列表示"avro_data"
将填充变体数据。我计划将数据复制到结构化表target_table
中,其中列的名称和数据类型与avro_data
源表中的字段相同。例子:
select avro_data from source_table
{"C1":"V1", "C2", "V2"}
这将导致
select * from target_table
------------
| C1 | C2 |
------------
| V1 | V2 |
------------
我的问题是,当avro_data
进化模式和新字段被添加时,如何target_table
通过在目标表中添加等效列来保持模式同步?
雪花中是否有任何开箱即用的东西来实现这一目标,或者是否有人创建了任何代码来做类似的事情?
解决方案
这里有一些东西可以帮助您入门。它展示了如何获取一个变体列并解析出内部列。这使用了 Snowflake 示例数据数据库中的一个表,该表并不总是相同的。您可以调整表名和列名。
SELECT DISTINCT regexp_replace(regexp_replace(f.path,'\\\\[(.+)\\\\]'),'(\\\\w+)','\"\\\\1\"') 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]")
DECODE (substr(typeof(f.value),1,1),'A','ARRAY','B','BOOLEAN','I','FLOAT','D','FLOAT','STRING') AS attribute_type, -- This generates column datatypes of ARRAY, BOOLEAN, FLOAT, and STRING only
REGEXP_REPLACE(REGEXP_REPLACE(f.path, '\\\\[(.+)\\\\]'),'[^a-zA-Z0-9]','_') AS alias_name -- This generates column aliases based on the path
FROM
"SNOWFLAKE_SAMPLE_DATA"."TPCH_SF1"."JCUSTOMER",
LATERAL FLATTEN("CUSTOMER", RECURSIVE=>true) f
WHERE TYPEOF(f.value) != 'OBJECT'
AND NOT contains(f.path, '[');
这是从此处修改的代码片段:https ://community.snowflake.com/s/article/Automating-Snowflake-Semi-Structured-JSON-Data-Handling 。博客作者将此部分代码归功于一位同事。
虽然存储过程的当前化身将从变体中的内部列创建视图,但替代版本可以创建和/或更改表以使其与更改保持同步。
推荐阅读
- kotlin - Kotlin 库的公共 API 检查
- racket - 用一系列已知元素填充列表
- cassandra - Jupyter notebook 正在 linux 上查询 cassandra,输出有时间戳 utc 而不是 cst
- c - 如何在 C 的命令行参数中指定此类目录名称的目录中创建文件
- visual-studio - 两个碰撞器正在碰撞,但 OnColliderEnter2d 函数也没有被执行
- google-bigquery - 从简单的 STRUCT 数据类型中提取值
- r - R mac catalina tabulizer 失败,出现 java 运行时缺失错误,但已安装 java
- arrays - 处理结构内的可变字符串数组 (C)
- python - 如何从欧拉角计算“旋转流动性”的量度?
- python - 使用 numpy.polynomial.legendre 时,如何获得将输入转换为勒让德多项式的参数的函数?