从时间序列表中创建Spark中的图形

时间:2016-07-05 19:07:28

标签: apache-spark spark-graphx

假设我有一个包含三列的表格; user, time, place。我想为每个用户创建一个place转换的图表,如果它们之间的时间低于某个阈值;即,在按用户分组并按时间排序之后,从连续行(i,j)创建边缘place_i到place_j的有向图,为(place_i,place_j)的每个实例递增边缘的权重。源表的行没有特定的顺序。这可能与Python API一起使用吗?如果没有,我怎么能在Scala中做到?

样本表:

user,time,place
joe,1,A
jack,1,B
joe,2,B
jack,3,C
joe,4,D
jane,5,A
jane,1,B

如果忽略时间阈值约束,图形应该有四个顶点(A,B,C,D)和来自{(A,B),(B,C),(B,D)的边,(B) ,A)}。

2 个答案:

答案 0 :(得分:0)

Advanced Analytics with Spark中有一章介绍如何使用地理数据。我想这是第8章。作者讨论了与您的问题相关的spark中的会话化

为了让每个特定用户的所有转换在时间上彼此接近, Sandy Ryza 调用此SecondarySort,这在火花核心中并未完全实现,但他提供了一些代码来执行此操作,您可以找到它here

我相信如果您阅读该章并遵守相关规则,您就会得到您正在寻找的内容。

答案 1 :(得分:0)

我使用groupBy后跟flatMapGroups。在地图内部,我将迭代器实例化为一个列表,以便对其进行排序。然后我使用sliding成对地遍历列表并创建边缘。

ds.groupBy(_.user).flatMapGroups( (uid, iter) =>
 val result = ListBuffer[MySchema]()
 iter.toList.sortBy(_.time).sliding(2).foreach { case List(x,y =>
   result += MySchema(uid, x.place, if (y.time - x.time < Threshold) y.place else 0)
 }
 result.toList
}.as[AggSchema].groupBy($"src, $"dst).count.as[Schema]