BigQuery:如何动态查询Firebase每日事件表并调度查询任务
解决Firebase每日事件表动态查询的问题
嘿,我明白你的困扰了——原本以为是分区表,结果发现是一个个独立的events_YYYYMMDD格式的每日表,直接用_PARTITIONTIME肯定行不通,因为那是分区表特有的字段。不过别担心,用BigQuery的动态SQL就能完美解决这个问题!
核心思路
既然表名是按日期固定格式命名的,我们可以先拼接出前一天的完整表名,再通过EXECUTE IMMEDIATE执行动态生成的查询语句。
基础查询示例
下面的代码会自动生成前一天的events表名,并查询该表的所有数据:
DECLARE target_table STRING; -- 拼接前一天的完整表名 SET target_table = CONCAT( 'appname-11111.analytics_11111111.events_', FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE(), INTERVAL 1 DAY)) ); -- 执行动态查询 EXECUTE IMMEDIATE CONCAT('SELECT * FROM `', target_table, '`');
数据更新示例
如果是要把前一天的数据同步到目标表,只需要修改EXECUTE IMMEDIATE里的语句就行:
DECLARE target_table STRING; SET target_table = CONCAT( 'appname-11111.analytics_11111111.events_', FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE(), INTERVAL 1 DAY)) ); -- 插入到目标表(根据需求换成UPDATE逻辑也可以) EXECUTE IMMEDIATE CONCAT( 'INSERT INTO `your-target-table-full-name` ', 'SELECT * FROM `', target_table, '`' );
可选:处理表不存在的情况
如果担心前一天的表还没生成(比如数据延迟),可以加个异常处理,避免任务报错:
DECLARE target_table STRING; SET target_table = CONCAT( 'appname-11111.analytics_11111111.events_', FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE(), INTERVAL 1 DAY)) ); BEGIN EXECUTE IMMEDIATE CONCAT('SELECT * FROM `', target_table, '`'); EXCEPTION WHEN ERROR THEN SELECT CONCAT('提示:表 ', target_table, ' 不存在,可能数据还未同步') AS notice; END;
内容的提问来源于stack exchange,提问作者SagiLow
相关产品推荐
相关产品推荐

