2

我是 BigQuery 的新手,非常感谢您的帮助。我试图保持我的案例通用,以便对其他人有用。我敢肯定这是非常基本的,我错过了一些东西......

我有 2 个数据集,“Master”和“New”。Master 包含几列,并且已经有很多行。我想将一个新数据集合并到主列表中,但是这个新数据集中的条目可能在所有列中都有值,也可能没有。此外,新列表中的值可能已经或可能不存在于主列表中。两者都有一个唯一/主键(例如 Col1) 例如:

掌握:

Col1 | Col2 | Col3 | Col4

VAL11 | VAL12 | VAL13 | VAL14

VAL21 | VAL22 | VAL23 | VAL24

VAL31 | VAL32 | VAL33 | VAL34

新的:

Col1 | Col5 | Col6

VAL11 | VAL15 | 无效的

VAL41 | VAL45 | VAL46

以下是我的问题:

1)为了合并两个数据集,我必须写什么 bigquery,具有以下要求:a)值应该合并到记录中,例如,当 master 中的前一条记录在某处有“null”时,新数据集有它的价值,那么它应该出现在那里。b) 如果存在“冲突”,则旧值应被新值覆盖

我认为这基本上只是一个完整的外连接,但 BigQuery 只支持内连接和左外连接......

2)如果有可能,使用更多嵌套的逻辑,我希望能够以更精细的方式做2b),例如“如果存在冲突,并且原始值为X,则覆盖,否则不要覆盖/保留该列的原始值(该记录的其他值将不受影响)。

3)如果可能的话,使用一些更嵌套的逻辑,我想能够说“如果 val34 和 val36 都是 TRUE,那么也将 val38 设置为 TRUE,否则如果 val37 是 X,那么将 val38 设置为X”

现在,这是 3 个不同但相关的问题,如果你能帮助我解决任何一个问题,那就太好了。顺便说一句,我正在使用 bigquery,因为数据集太大,普通数据库无法处理,而且它是一个非常方便的工具,我可以轻松地在整个团队中共享。

非常感谢您的帮助和指点!

ps 这里是 BigQuery 文档https://developers.google.com/bigquery/query-reference

4

1 回答 1

2

1) 我已经提交了一个错误来支持 FULL OUTER JOIN。AFAIK 这应该是一个简单的改变,但需要更多的调查。如果不想等待,可以运行三个查询来获取左侧、右侧和内连接。(您可以将结果附加在一起,或者您可以创建一个外部查询,将其他查询包装为联合表以一次性完成)。

1a:

SELECT col1, col2, col3 
FROM [tables.master]
WHERE col1 NOT IN (
  SELECT col1 FROM [tables.new])

1b:

SELECT col1, col5, col6
FROM [tables.new]
WHERE col1 NOT IN (
  SELECT col1 FROM [tables.master])

1c:

SELECT master.col1 as col1,     
  IF (new.col2 is not NULL, new.col2, master.col2) as col2, 
  IF (master.colI == X, new.colI, master.colI) as colI, 
  IF (master.colK AND master.colL, new.colJ, master.colJ) as colJ, 
FROM [tables.master] as master
INNER JOIN [tables.new] as new
ON master.col1 = new.col1

我认为 col2 的计算满足 1),colI 满足 2),colJ 满足 3。如果不是,我可能不明白你在问什么,如果你能澄清一下那就太好了。

当/如果实现 FULL OUTER JOIN 时,您可以摆脱前两个查询并将第三个查询更改为 FULL OUTER 而不是 INNER JOIN。

于 2013-10-16T20:25:37.540 回答