redis - 使用大列表的地理定位数据,用纬度/经度标记巨大的元素列表

标签 redis apache-spark geolocation google-bigquery google-cloud-dataflow

我有一个巨大的地理位置事件列表:

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/

相关文章:

iOS:如何使用 Google map 根据用户输入获取方向?

javascript - 谷歌地图api v3,定义用户当前位置

r - 通过R在redis中存储大数据帧

php - 使用 mysqlDB 的结果 hmset redis

java - 如何根据给定分区过滤 RDD?

mysql - Cassandra + Spark 与 MySQL + Spark

javascript - 在本地网络上测试时使用 geolocation.getCurrentPosition

redis - 如何找到 Redis 主题(键的子集)的大小?

Redis:我是否错误地使用了sismembers?

apache-spark - 根据pyspark中的条件从数据框中删除行