问题标签 [data-vault]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
sql - 雪花我们如何遍历临时表的每一行并将其值插入到另一个表中,其中每个字段的值都是单行?
我们正在将数据加载到事实表中,我们在 Snowflake 上的原始临时表如下所示:
其中indicator_nbr
字段是调查中提出的问题。
我们正在使用数据建模技术来构建我们的仓库数据库,因此数据将被添加到事实表中,如下所示:
如果还有其他问题,则对指标 2 和 3 以此类推。
每个字段及其值将作为一行。当然,还有其他元数据要添加load_dt
,record_src
但它们不是问题。
当前脚本正在执行以下操作:
将字段放入数组 =>
fields_array = ['indicator_1', 'indicator_2', 'indicator_3']
一个循环将在数组上运行,并开始为每行添加每个字段及其值。所以假设我们有 100 行,我们将运行 300 次插入,一次一个:
for (var col_num = 0; col_num<fields_array.length; col_num = col_num+1) {
}
正如在显示完整脚本的这篇文章的评论中提到的,最好循环连接每个from values
插入查询的字符串。
建议的解决方案有两个问题:
- Snowflake 上的查询有大小限制(应小于 1 MB);
- 如果我们要遍历每个字段并连接
from values
,我们也应该select
从临时表中进行查询以获取列的值,因此不会进行优化,或者我们会减少一点时间但不会太多了。
编辑:一个可能的解决方案
我正在考虑做一个 sql 查询,从临时表中选择所有内容,然后进行散列和所有内容,并在转置后将其保存到数组中,但我不知道该怎么做。
database - Data Vault 2 - 哈希差异和重复数据更改
当某些数据更改回以前的值时,我在检索卫星表中的最新值时遇到问题。
数据库是雪花。
根据 Data Vault 2.0,我目前正在使用 hash diff 函数来评估是否在卫星表中插入新记录,如下所示:
第一次,添加了AccountCode = '100000' 和SomeDetail = 'ABC' 的新记录:
MD5_HUB_ACCOUNT | HASH_DIFF | ACCOUNT_CODE | 描述 | 一些细节 | LDTS |
---|---|---|---|---|---|
c81e72... | 8d9d43... | 100000 | 一个帐户 | 美国广播公司 | 2021-04-08 10:00 |
一小时后,更新将SomeDetail的值更改为“DEF”,这是生成的表:
MD5_HUB_ACCOUNT | HASH_DIFF | ACCOUNT_CODE | 描述 | 一些细节 | LDTS |
---|---|---|---|---|---|
c81e72... | 8d9d43... | 100000 | 一个帐户 | 美国广播公司 | 2021-04-08 10:00 |
c81e72... | a458b2... | 100000 | 一个帐户 | 国防军 | 2021-04-08 11:00 |
第三次更新将SomeDetail的值设置回“ABC”,但该记录并未插入卫星表中,因为散列差异的值与第一个插入的记录相同(即 8d9d43...)。
如果我查询卫星表中的最新记录,LDTS 列会告诉我它是带有“DEF”的记录,这不是所需的结果。相反,我应该有SomeDetail = 'ABC' 和LDTS = '2021-04-08 12:00' 的记录。
对此的正确方法是什么?如果我将LoadDTS添加到哈希差异,每次推送更新时都会创建一条新记录,这也不是预期的结果。
data-vault - 填充有效性卫星并处理乱序更改事件
在https://www.linkedin.com/pulse/data-lt-mysteries-effectivity-satellite-driving-key-patrick-cuba/?trk=read_related_article-card_title中,Patrick Cuba 展示了仅插入逻辑在填充效率卫星。
但是,当将其应用于我们有乱序事件的事件流时,摄取和查询逻辑的复杂性似乎爆炸式增长。
例子
考虑这一系列描述个人雇佣关系变化的变化事件。
person_id | 员工ID | src_event_time | 更改类型 |
---|---|---|---|
一个 | X | t1 | 插入 |
一个 | X | t2 | 删除 |
一个 | X | t3 | 插入 |
考虑以下场景,其中事件按顺序出现t3, t1, t2
,我们将其摄取到有效性链接卫星表中:
1.处理事件t3
person_id | 员工ID | 有效性开始日期 | 有效性结束日期 |
---|---|---|---|
一个 | X | t3 | t9999 |
2.处理事件t1
在我们的摄取逻辑中,我们可以确定新事件时间t1
在现有事件之前t3
。所以我们将有效性设置为介于t1
和t3
person_id | 员工ID | 有效性开始日期 | 有效性结束日期 |
---|---|---|---|
一个 | X | t3 | t9999 |
一个 | X | t1 | t3 |
3.处理事件t2
这就是事情变得有点奇怪的地方。我们的逻辑必须检测到存在有效期限(从 t1 到 t3),然后通过添加 (t1 - t2) 有效期限来“纠正”它。由于我们的约束是我们只插入而不更新现有行,因此我们现在有两个具有相同 start time 的有效行t1
。
person_id | 员工ID | 有效性开始日期 | 有效性结束日期 |
---|---|---|---|
一个 | X | t3 | t9999 |
一个 | X | t1 | t3 |
一个 | X | t1 | t2 |
问题
这是正确的方法吗?我将如何查询给定时间点的关系状态?(例如,我将如何查询t1.5
, 或的关系t2.5
?)
data-modeling - 如何在 Data Vault 模型中处理已删除的记录(来自源)?
我们正在构建一个Data Vault (2.0)
模型来捕获 SalesForce 数据。与许多其他来源一样,来源中的记录被软删除。当我们向数据模型采购数据时,我们不想过滤任何数据并捕获目标系统中已删除的记录。搜索了在 Data Vault 模型中处理已删除记录的最佳实践,但没有成功。有人可以在这里发光吗?我们应该添加IsDeleted
标志Hub
还是Satellite
考虑模型的未来扩展和要遵循的最佳设计实践。此外,此处的任何参考资料链接都会有很大帮助。谢谢你。
database-design - 使用 Data Vault 建模 INFORMATION_SCHEMA
我正在尝试使用数据保险库方法对一种 INFORMATION_SCHEMA 进行建模,以检测数据沿袭,但我对如何实现表及其列之间的关系感到有些困惑。某些列具有相同的名称,例如 ID 或名称,但描述和含义不同。
我想要 2 个 HUB,一个用于表,一个用于列,以便能够为每个 HUB 创建分层链接,用于存储这些原始对象和转换公式。
如果我要为表创建 HUB 并为列创建 HUB,我应该使用什么作为列的业务键,因为列名不是唯一的?如果我使用多活动卫星建模方法将列放入 HUB_TABLE 的卫星表中,我不能简单地为该卫星创建分层链接。
有更好的想法或建议吗?
用 1:n 关系对这种嵌套结构建模的最佳实践是什么?(数据库 -> 架构 -> 表 -> 列)?
data-modeling - 如何在没有强关系键(外键)的情况下在数据库中创建 LINK?
我们的销售代表会致电潜在客户来提出服务建议。潜在客户存储在 Crm 中,具有以下属性:LeadId、PrimaryContactNumber、SecondaryContactNumber。所有通话均通过 Teams 完成并记录下来。可以通过 Microsoft Graph Api 提取呼叫并具有以下属性:CallId、UserId、CalleeNumber、CallerNumber、Duration。用户具有以下属性:用户 ID、用户名、电子邮件。当外键未知时,如何使用数据库建模生成 LINK(用户、潜在客户之间的关系)?我认为我的设计应该是这样的:User(hub)-Call(link)-Lead(hub),但是我的调用只有 userId,leadId 只能从 Lead 属性之一推断出来(PrimaryContactNumber 或 SecondaryContactNumber) 什么是这个问题的最佳解决方案?或者我应该将 Call 建模为集线器并在将数据加载到数据集市时执行过滤器?
sql - 使用条件插入全部替换数据保险库模型中多个表的合并语句是否会减少摄取时间?
我每天都将数据加载到 Snowflake 数据仓库上的数据保险库模型中。
我已将摄取脚本(javascript 程序)拆分为 3 个主要部分以用于记录目的。
- 将数据放入临时表
- 元数据部分,我将数据添加到几个集线器和链接中,其中包含每行的元数据(位置、数据条目名称……)
- 将主要数据持有指标及其值加载到特定的集线器和卫星中。
以下是数据文件每个部分的平均加载时间,该数据文件包含大约 2000 行,指标值约为 300k:
- 将数据从阶段添加到临时表需要 3 到 5 秒
- 将元数据添加到 9 个集线器、卫星和链路需要 19 到 25 秒
- 将 2000 行添加到集线器中,然后将 300k 值添加到 sat 和 link 需要 3 到 5 秒。
对于第 2 部分,无论是否需要插入,因为我使用的是合并语句,这将花费相同的时间。
我想到了很多事情,因为如果最初没有找到的价值正在增加,那么加载数千条记录需要几秒钟的时间,同时合并到几个集线器(表)中。
我可以替换与第 2 部分相关的表的所有合并语句并用一个条件替换它吗
考虑到每个表上的 where 子句将包含一个 select 子查询以确保不会再次添加现有数据,是否可以插入条件类似于 merge 语句不匹配时的条件可以减少摄取时间?
我正在阅读这篇关于优化加载到数据保险库模型中的文章及其在 github 上的相关脚本,但仍然担心以一种有效的方式减少摄取时间。
sql - SCD Type-2 使用 INSERT 策略
我正在使用 Data Vault 2.0 模型。在这里,我们不应该在表中使用 UPDATE。通常在 RDBMS 中,我们使用 UPDATE & INSERT 策略来实现 SCD-2。但就我而言,我只能使用 INSER 策略。我的源是 Kafka 输入,它被加载到雪花中(作为 avro 格式),我正在展平并将其加载到另一个 RDBMS 格式的表中。
我的问题是:谁能帮我在不使用 UPDATE 的情况下实现 SCD 类型 2 逻辑。只有使用 INSERT 策略我必须这样做。
我也应该保留历史。例如,如果我在区间-a 和区间-b 中得到 rec-1,我得到了 rec-1 的 2 次更新,那么我需要在我的目标中加载所有三个记录,指向最后一条记录将是最新的一。
data-vault - 时间点表 Data Vault 2.0
是否有任何用于填充 Data Vault 2.0 时间点表的查询示例?我找不到任何真正有用的东西。我理解概念,但有一个具体的例子会更有帮助。
database - Data Vault:链接和参考表
我有一个名为h_company
卫星的集线器并连接到它s_company
,其中包含有关我的 DWH 中公司的所有描述性信息。
在我的源数据库中,我有一个名为 的映射表company_branch
,它将公司映射到某个分支(一列是company_id,第二列是branch_id)。重要说明:卫星中不存在branch_ids_company
列。
我的源数据库中有第三个表,名为branch
,它由branch_id和description列组成。这将是一个完美的reference_table
,因为它不包含很多记录(仅 30 个分支),它不会发生太大变化并且具有参考表的结构(id 和描述列)。
我的问题是:建模公司 <--> 分支关系的最佳方法是什么?
理想的情况是,如果卫星
s_company
有branch_id列,那么基本上我可以将branch
表建模为我的 DWH 中的参考表,然后在 s_company 卫星上加入。但不幸的是,卫星中不存在branch_ids_company
列。我的方法是将
company_branch
表建模为链接,连接h_company
并h_branch
(从company_branch
表创建)并创建s_branch
卫星(从branch
表创建)。但是这种方法看起来有点矫枉过正,因为分支并不是真正的业务对象,只是附加信息(完美的参考表)和分支卫星将只包含 30 条记录。
在这种情况下,您将如何建模公司 <--> 分支机构关系?
表:
h_company 列: company_id、technicall_columns
s_company 列: company_id、desctiptive_columns(没有 branch_id)、technicall_columns
company_branch 列: company_id、branch_id
分支列: branch_id、描述