我目前正在使用ETL管道进行工作,该管道使用BigQuery存储临时数据,然后使用Dataprep转换数据并将其存储在新的BigQuery表中进行生产。
我们一直在遇到问题,这些问题的发现是在少量数据选择上应用这些转换的最经济有效的方法,通常仅是登台数据表中当前最大日期之后的最后X天。例如,我们需要计算登台数据中的最大可用日期,然后检索从该日期起过去3天内的所有行。不幸的是,我们不能依靠临时数据中的“最大日期”始终是最新的(此数据来自质量和可靠性各异的第三方API。)
首先,我尝试通过获取最大日期,使用DATEDIFF创建一个比较列,然后丢弃比此“最大日期”早3天的行来直接在Dataprep中应用这些转换。事实证明,这非常耗时且成本低。
我们接下来要尝试的是在BigQuery视图中过滤数据,然后将其用作Dataprep流的初始数据集(数据将在Dataprep应用任何转换之前进行预过滤)。我们首先尝试在BigQuery中动态地执行此操作,如下所示:
void*
但是在预览GB /查询的估计成本时,它看起来效率非常低而且昂贵。
接下来我们尝试对日期进行硬编码,由于某种原因,它使价格便宜得多/更快捷:
printf("%p\n",(void*)p);
因此,我们目前的计划是维护每个表的视图,并在每次临时数据成功完成(https://cloud.google.com/bigquery/docs/managing-views)时通过Python SDK在视图SQL中更新硬编码日期。
感觉我们可能缺少解决此问题的更简单/更有效的解决方案。所以我想问:
答案 0 :(得分:3)
您是否熟悉标准SQL的MERGE语句和发布的clustering feature?实际上可以合并您的数据,并且您可以进一步customize it以仅读取某些分区。
手册中的示例:
MERGE dataset.DetailedInventory T
USING dataset.Inventory S
ON T.product = S.product
WHEN NOT MATCHED AND quantity < 20 THEN
INSERT(product, quantity, supply_constrained, comments)
VALUES(product, quantity, true, ARRAY<STRUCT<created DATE, comment STRING>>[(DATE('2016-01-01'), 'comment1')])
WHEN NOT MATCHED THEN
INSERT(product, quantity, supply_constrained)
VALUES(product, quantity, false)
提示:您可以按null
进行分区,并且仅利用“集群级别”