我在 BigQuery 中的 JOIN 错误

Posted

技术标签:

【中文标题】我在 BigQuery 中的 JOIN 错误【英文标题】:Error on my JOIN in BigQuery 【发布时间】:2018-05-24 13:37:59 【问题描述】:

我正在尝试将一个表中的数据与其他三个表中的相应匹配字段连接起来。

当我有一个 JOIN 时它工作正常,但添加其他的我收到以下错误消息:

字段 'dtftv2_sprt_p_match_table_advertisers_166401._PARTITION_LOAD_TIME' 在 JOIN 的任一侧都找不到

这里是我的查询:

SELECT
dtftv2_sprt.sprt_all_clicks.Date as Date,
dtftv2_sprt.p_match_table_advertisers_166401.Advertiser as Advertiser,
dtftv2_sprt.p_match_table_campaigns_166401.Campaigns as Campaign,
dtftv2_sprt.p_match_table_placements_166401.Placements as Placement,
dtftv2_sprt.sprt_all_clicks.Clicks as Clicks

FROM [dtftv2_sprt.sprt_all_clicks]

INNER JOIN [dtftv2_sprt.p_match_table_advertisers_166401] ON 
dtftv2_sprt.sprt_all_clicks.Advertiser_ID = 
dtftv2_sprt.p_match_table_advertisers_166401.Advertiser_ID

INNER JOIN [dtftv2_sprt.p_match_table_campaigns_166401] ON 
dtftv2_sprt.sprt_all_clicks.Campaign_ID = 
dtftv2_sprt.p_match_table_campaigns_166401.Campaign_ID

INNER JOIN [dtftv2_sprt.p_match_table_placements_166401] ON 
dtftv2_sprt.sprt_all_clicks.Placement_ID = 
dtftv2_sprt.p_match_table_placements_166401.Placement_ID

GROUP BY
Date,
Advertiser,
Campaign,
Placement,
Clicks

我没有将 _PARTITION_LOAD_TIME 链接到任何地方,那为什么要大惊小怪呢? INNER JOINS 使用正确的?

【问题讨论】:

这个错误看起来有点不对劲。 dtftv2_sprt_p_match_table_advertisers_166401._PARTITION_LOAD_TIMEdtftv2_sprt.p_match_table_campaigns_166401.Campaign_ID 我不确定这是否是复制代码和错误时的拼写错误,但看起来这里的标识符之一可能搞砸了。 (注意下划线与句号) 那是准确的错误和准确的代码。为什么我也很困惑。 为表命名并使用别名而不是完全限定名称。我只是好奇会发生什么。这将减少该名称的出现次数,并让您专注于特定的连接/错误。 全部;但似乎 _PARTITION_LOAD_TIME 是特定的:对于 bigQuery cloud.google.com/blog/big-data/2016/03/…,所以我需要阅读更多内容。可能与系统中表的创建方式有关;并且可能需要在使用 p_match_table_advertisers_16640 表时指定分区 可能相关:***.com/questions/44313588/… 【参考方案1】:

只是试图将问题限制在连接上:也许它与创建/使用的表的分区有关。我不知道系统在执行查询时是否需要有关使用哪个分区的信息。不过,我以前从未见过这样使用的分区。

#standardSQL
SELECT AC.Date as Date,
      TA.Advertiser as Advertiser,
      TC.Campaigns as Campaign,
      TP.Placements as Placement,
      AC.Clicks as Clicks
FROM `dtftv2_sprt.sprt_all_clicks` AC
INNER JOIN `dtftv2_sprt.p_match_table_advertisers_166401` TA 
   ON AC.Advertiser_ID = TA.Advertiser_ID
INNER JOIN `dtftv2_sprt.p_match_table_campaigns_166401` TC 
   ON AC.Campaign_ID = TC.Campaign_ID
INNER JOIN `dtftv2_sprt.p_match_table_placements_166401` TP 
   ON AC.Placement_ID = TP.Placement_ID
GROUP BY Date,
         Advertiser,
         Campaign,
         Placement,
         Clicks

也许是基于"Error: Field '[REDACTED].field_id' not found on either side of the JOIN", Google BigQuery的反引号而不是[]

【讨论】:

完美!仍然奇怪为什么使用 Alias 绕过了这个问题。为了将来参考,我会尽可能地尝试使用 alias'。谢谢! 哦,我不能说它为什么有效;我自己并不完全理解这个问题!很明显,它必须与引擎如何解析 SQL 相关;我自己对 BigQuery 不够熟悉,不知道在这种情况下发生了什么;但我知道缩小问题的范围可以让我孤立起来,这样做有时会解决问题。 出于好奇,您是否也将[] 更改为反引号?或者只是改变别名? #standardSQL的申请呢?再次尝试改进问题/答案以更好地帮助他人。 我将它切换到反引号,并使用标准 SQL,通常我使用旧版 SQL,但无论哪种方式都可以。 添加了一个更新,如果有人需要,也可以使用旧版 SQL。【参考方案2】:

为了参考,这里还有旧 SQL 版本:

SELECT AC.Date as Date, 
       TA.Advertiser as Advertiser,
       TC.Campaign as Campaign,
       TP.Placement as Placement,
       AC.Clicks as Clicks

FROM [dtftv2_sprt.sprt_all_clicks] AC

INNER JOIN [dtftv2_sprt.p_match_table_advertisers_166401] TA 
   ON AC.Advertiser_ID = TA.Advertiser_ID

INNER JOIN [dtftv2_sprt.p_match_table_campaigns_166401] TC 
   ON AC.Campaign_ID = TC.Campaign_ID

INNER JOIN [dtftv2_sprt.p_match_table_placements_166401] TP 
   ON AC.Placement_ID = TP.Placement_ID

GROUP BY Date,
         Advertiser,
         Campaign,
         Placement,
         Clicks

【讨论】:

以上是关于我在 BigQuery 中的 JOIN 错误的主要内容,如果未能解决你的问题,请参考以下文章

临时函数的 BigQuery LEFT OUT JOIN 错误?

Big Query 中的正确案例

Firebase Analytics 中的事件未显示在 Big Query 中

错误代码 BIG QUERY:预期输入结束,但得到关键字 SELECT bigquery

当Big Query加载失败并且CSV表遇到太多错误时,获取更多信息,放弃[重复]

BigQuery 中的多个左连接