我目前正在寻找处理两个非常大的数据集的最佳方法。
我有两个BigQuery表:
- 一个包含流事件的表(十亿行)
- 一个包含标签和相关事件属性的表(100,000行)
我想用基于事件属性的适当标记标记每个事件(一个事件可以有多个标记)。然而,对于数据集的大小来说,SQL交叉连接似乎太慢了。
继续使用mapreduce管道的最佳方法是什么非常昂贵的洗牌阶段,因为每个事件必须与每个标签进行比较。
我还计划使用谷歌云数据流,这个工具适合这个任务吗?
Google Cloud Dataflow很适合这个。
假设标签数据足够小,可以装入内存中,您可以通过将其作为SideInput传递来避免洗牌。
您的管道看起来像下面的
- 使用两个BigQueryIO转换从每个表中读取。
- 创建一个DoFn标记每个事件与它的标签。DoFn的输入PCollection应该是事件。传递标签表作为侧输入。
- 使用BigQueryIO转换将结果写回BigQuery(假设您想使用BigQuery作为输出)
如果你的标签数据太大,内存无法容纳,你很可能不得不使用Join