有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Spark数据帧连接,范围慢

我有火花作业的以下输入数据(拼花):

Person (millions of rows)
+---------+----------+---------------+---------------+
|  name   | location |     start     |      end      |
+---------+----------+---------------+---------------+
| Person1 |     1230 | 1478630000001 | 1478630000010 |
| Person2 |     1230 | 1478630000002 | 1478630000012 |
| Person2 |     1230 | 1478630000013 | 1478630000020 |
| Person3 |     3450 | 1478630000001 | 1478630000015 |
+---------+----------+---------------+---------------+


Event (millions of rows)
+----------+----------+---------------+
|  event   | location |  start_time   |
+----------+----------+---------------+
| Biking   |     1230 | 1478630000005 |
| Skating  |     1230 | 1478630000014 |
| Baseball |     3450 | 1478630000015 |
+----------+----------+---------------+

我需要将其转化为以下预期结果:

[{
    "name" : "Biking",
    "persons" : ["Person1", "Person2"]
},
{
    "name" : "Skating",
    "persons" : ["Person2"]
},
{
    "name" : "Baseball",
    "persons" : ["Person3"]
}]

换句话说:结果是每个事件的列表,每个事件都有一个参与该事件的人员列表

如果发生以下情况,则该人被视为参与者:

Person.start < Event.start_time 
&& Person.end > Event.start_time
&& Person.location == Event.location

我尝试过不同的方法,但唯一有效的方法是 连接两个数据帧,然后按事件对它们进行分组/聚合。 但是连接速度非常慢,并且不能很好地分布在多个CPU核上

联接的当前代码:

final DataFrame fullFrame = persons.as("persons")
    .join(events.as("events"), col("persons.location").equalTo(col("events.location"))
               .and(col("events.start_time").geq(col("persons.start")))
               .and(col("events.start_time").leq(col("persons.end"))), "inner");

//count to have an action 
fullFrame.count();

我正在使用Spark Standalone和Java,如果这有区别的话

有人对如何使用Spark 1.6.2解决此问题有更好的想法吗


共 (1) 个答案

  1. # 1 楼答案

    范围联接作为与后续过滤步骤的叉积执行。一个可能更好的解决方案是,广播可能更小的events表,然后映射persons表:在映射内,检查连接条件并生成相应的结果