在BigQuery中合并两个丢失相关的数据集

时间:2013-10-16 19:39:50

标签: google-bigquery merging-data

我是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,因为数据集太大而无法处理普通数据库,因为它是一个非常方便的工具,我可以在整个团队中轻松共享。

感谢您的帮助和指点!

P.S。这是BigQuery文档https://developers.google.com/bigquery/query-reference

1 个答案:

答案 0 :(得分: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。