我有一个巨大的地理位置事件列表:
Event (1 billion)
------
id
datetime
lat
long
以及从开放街道 map 加载的兴趣点列表:
POI (1 million)
------
id
tag (shop, restaurant, etc.)
lat
long
我想为每个事件分配兴趣点的标签。解决这个问题的最佳架构是什么?我们尝试使用 Google BigQuery,但我们必须进行交叉连接,但它不起作用。我们愿意使用任何其他大数据系统。
最佳答案
使用 Dataflow,您可以使用 CoGroupByKey 非常轻松地进行交叉连接。使用此方法,只有您要加入的事件和 POI 需要放入内存中(如果给定键的项目列表太大而无法放入内存,数据流将自动溢出到磁盘)。
这里有一些更多细节。
- 创建以纬度和经度为键控的事件 PCollection。
- 创建以纬度和经度为键控的 POI PCollection
- 使用 CoGroupByKey 连接两个 PCollection。
- 编写一个 DoFn 来处理 CoGbkResult
DoFn 看起来像:
PCollection<T> finalResultCollection = coGbkResultCollection.apply(ParDo.of( new DoFn<KV<K, CoGbkResult>, T>() { @Override public void processElement(ProcessContext c) { KV<K, CoGbkResult> e = c.element(); // Get all collection 1 values Iterable<Event> eventVals = e.getValue().getAll(eventTag); // Now get collection 2 values Iterable<Poi> poiVals = e.getValue().getAll(poiTag); for (Event e : eventVals) { for (Poi p : poiVal) { ... c.output(...tagged event...); } } } }));
正如本文中所讨论的 Answer您还可以使用侧面输入来传递 map ,其键是纬度和经度,值是 POI 的详细信息。如果数据可以装入内存,这种方法就会起作用。如果您只有 100 万个 POI 并且您只存储列出的字段,那么它可能适合内存。
注意:我是 Dataflow 团队的成员。
关于redis - 使用大列表的地理定位数据,用纬度/经度标记巨大的元素列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33282306/