- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
对于我的用例,我正在处理可通过源唯一键识别的数据,这些数据分解为 n 个(非确定性)目标条目,并加载到 BigQuery 表中以用于分析目的。
构建此 ETL 以使用 Mongo 最近的 Change Stream 功能我想删除 BigQuery 中的所有条目,然后以原子方式加载新条目。
探索 BigQuery DML 我看到一个 MERGE支持操作,但只有 WHEN MATCHED THEN DELETE
或 WHEN MATCHED THEN UPDATE
是可能的。
我对 WHEN MATCHED THEN DELETE, AND FOLLOW BY INSERT 操作感兴趣。
我如何在 BigQuery 中实现此类 ETL,同时在数据可用性和正确性方面尽可能保持原子性或最终一致性。
编辑 1:我想提供一个具体的例子来详细说明。
我对这个数据集唯一性的最低粒度是user_id
。行不是唯一可识别的。
示例
从 mongo 更改流接收到更新的用户对象:
user={_id: "3", name="max", registered="2018-07-05" q=["a", "b", "c"]}
当前 BigQuery.user_q 持有
| user_id | q |
...
| 3 | a |
| 3 | b |
...
转换代码将修改后的用户对象加载到 BigQuery.user_q_incoming
| user_id | q |
| 3 | a |
| 3 | b |
| 3 | c |
在 user_q
和 user_q_incoming
之间合并:
user_q
中属于 user_id 3
的 2 行已删除 user_q_incoming
中属于 user_id 3
的 3 行已插入。user_q
中的其余数据 (...
) 保留原样,未修改。BigQuery.user_q 持有
| user_id | q |
...
| 3 | a |
| 3 | b |
| 3 | c |
...
例如,用户可能会从他的个人资料中删除一个问题。将剩余的行保留为 q=["a", "c"]
。我还需要将其转化为 BigQuery 世界观。
最佳答案
BigQuery DML 支持 INSERT
A MERGE statement is a DML statement that can combine INSERT, UPDATE, and DELETE operations into a single statement and perform the operations atomically.
例如
MERGE dataset.Inventory T
USING dataset.NewArrivals S
ON FALSE
WHEN NOT MATCHED AND product LIKE '%washer%' THEN
INSERT (product, quantity) VALUES(product, quantity)
WHEN NOT MATCHED BY SOURCE AND product LIKE '%washer%' THEN
DELETE
所以,你应该好好使用你的 ETL
EDIT based on more specific details added to question
好的,我明白了——我认为在这种情况下 MERGE 将不适用,因为 INSERT 只能用于 NOT MATCH 子句。在这种情况下,有人可能会想出如何欺骗 MERGE 来工作,但与此同时,下面的解决方案可以实现您想要实现的目标 - 我认为是这样 :o)
CREATE OR REPLACE TABLE `project.dataset.user_q` (user_id INT64, q STRING) AS
SELECT * FROM `project.dataset.user_q`
WHERE NOT user_id IN (SELECT DISTINCT user_id FROM `project.dataset.user_q_incoming`)
UNION ALL
SELECT * FROM `project.dataset.user_q_incoming`
WHERE user_id IN (SELECT DISTINCT user_id FROM `project.dataset.user_q`)
关于mongodb - BigQuery 中的行级原子 MERGE REPLACE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51171517/
我正在从一个旧数据库中选择数据,该数据库有一个滥用状态列。状态列中包含多条信息。值如“新联系人 YYYY”、“在线 YYYY”、“更新 YYYY”、“撤回 YYYY”等……。您可能已经猜到了,YYYY
我想使用ant的replace任务替换这样的文件之一中的 token : 版本.txt version.number=${versionNumber} build.gradle task writeV
sorted_elems 列表中有一些元素将被更改为 str 例如: sorted_elems = ['[abc]', '[xyz]', ['qwe']] 我想删除定义的字符 - [, ], ' 并打
如果替换在变量中传递,第一次和第二次替换是否等效? #!/usr/bin/env perl6 use v6; my $foo = 'switch'; my $t1 = my $t2 = my $t3
我正在做一个本地测试来比较 C# 中 String 和 StringBuilder 的 Replace 操作性能,但是对于 String 我使用了以下代码: String str = "String
我看到了所有内容,没有看到使用“--replace”的方式的内容。 如何在 wkhtmltopdf 中使用“--replace”。 请给我一个例子,谢谢。:) 最佳答案 假设您有一个页脚 my_foo
我需要在 50 多个文件中进行大量搜索/替换,并且正在使用 Sublime Text 3。 有没有办法逐步执行并交互确认每个更改?我不想要只执行所有替换的一揽子“全部替换”操作。 我正在思考 vi/v
那么“replace ”属性如何与 composer 一起使用? ?我已经阅读了 Composer 文档,但仍然不明白。搜索更多信息并没有回答我的问题。 当我查看Laravel/Framework上的
我在玩 F# 句法。 在瑞典,我们有一个游戏叫做“Backslang”(谷歌翻译自“Rövarspråk”) 规则很简单。你说的所有话都必须以特定的方式说出来。虽然人声是相同的,但每个辅音都必须用“o
是否可以在Atom或Sublime Text中对“item”一词使用“查找和替换”并将其替换为“item [i]”,其中[i]是从1开始的数字? 我有一堆看起来像这样的物品: item1 item1
我不太确定如何解释,所以我将从输出开始。我需要返回这个: { replies: [ { type: 'text', content: 'one' } { type:
我是 C# 的新手,所以请原谅我的错误。 我想在每次调用该段代码时(每次调用 2-4 次)替换字符串的某些部分。我想知道哪种方法在性能方面更好:string.Replace 或 stringBuild
我了解.Replace() 和-replace 之间的区别,但是什么是-replace 和[Regex]: :替换()? 我测试了以下 2 个代码,但对我来说结果完全一样。 我还引用了 PowerSh
如果我正在做类似的事情: someString.Replace("abc","").Replace("def","").Replace(@"c:\Windows","") 我怎样才能把它替换成 Reg
我是 C# 的新手,所以请原谅我的错误。 我想在每次调用该段代码时(每次调用 2-4 次)替换字符串的某些部分。我想知道哪种方法在性能方面更好:string.Replace 或 stringBuild
当我使用 call() 或 apply() 时,我遇到了问题。 console.log(String.prototype.replace === String.replace);//false 我认为
在我使用 5-10 个替换的情况下是否有必要使用 stringbuilder。 String someData = "......"; someData = someData.replaceAll("
我有一个字符串,我需要用字典中的值替换其中的标记。它必须尽可能高效。使用 string.replace 进行循环只会消耗内存(记住,字符串是不可变的)。 StringBuilder.Replace()
我正在使用具有许多不同库依赖项的 gradle 项目并使用新的 list 合并。在我的 标签我已经这样设置了: .... 但我收到错误消息: /android/MyApp/app/src/main
我正在尝试从一个数据库中的表中提取模式并将其传输到另一个数据库。以下是执行此操作的函数的一部分。 当 Table( ... ) 时出错被称为。 功能示例: def transfer_data(self
我是一名优秀的程序员,十分优秀!