BigQuery多表JOIN报错:_PARTITION_LOAD_TIME字段未找到
问题解答
为什么会触发_PARTITION_LOAD_TIME相关错误?
你遇到的这个问题和BigQuery的SQL语法版本直接相关——当前你用的是Legacy SQL(从用[]包裹表名的写法能看出来)。Legacy SQL在处理多表JOIN时,会自动尝试对分区表做分区对齐优化,这时候它会去查找分区相关字段(比如_PARTITION_LOAD_TIME)。但这里有两个可能的诱因:
- 一是Legacy SQL对带点的表名(比如
dtftv2_sprt.p_match_table_advertisers_166401)解析存在问题,错误地把整个带点的表名当成了一个无分隔的表名(也就是把点换成了下划线变成dtftv2_sprt_p_match_table_advertisers_166401),导致找不到对应的分区字段; - 二是你的某个关联表可能不是分区表,但Legacy SQL仍然强制尝试读取分区字段,从而触发错误。
最直接的解决方法是切换到BigQuery推荐的Standard SQL,它对分区表的支持更稳定,也不会有这种自动优化带来的奇怪问题。修改后的查询语句(给表加了别名让代码更简洁):
#standardSQL SELECT s.Date as Date, a.Advertiser as Advertiser, c.Campaigns as Campaign, p.Placements as Placement, s.Clicks as Clicks FROM `dtftv2_sprt.sprt_all_clicks` s INNER JOIN `dtftv2_sprt.p_match_table_advertisers_166401` a ON s.Advertiser_ID = a.Advertiser_ID INNER JOIN `dtftv2_sprt.p_match_table_campaigns_166401` c ON s.Campaign_ID = c.Campaign_ID INNER JOIN `dtftv2_sprt.p_match_table_placements_166401` p ON s.Placement_ID = p.Placement_ID GROUP BY Date, Advertiser, Campaign, Placement, Clicks
INNER JOIN是否合适?
这完全取决于你的业务需求:
- 如果只有当点击记录在广告主、活动、投放表中都能找到对应ID的匹配记录时,你才需要保留这条数据,那INNER JOIN是完全合适的,它会过滤掉所有没有完整匹配的记录;
- 如果即使某个匹配表中没有对应ID(比如某条点击的广告主ID在广告主表里不存在),你仍然想保留这条点击记录,只是对应的广告主/活动/投放字段显示为NULL,那你应该把INNER JOIN换成LEFT JOIN,这样不会丢失原点击表中的数据。
内容的提问来源于stack exchange,提问作者Charl
相关产品推荐
相关产品推荐

