gpt4 book ai didi

java - Spark 数据帧加入范围慢

转载 作者:搜寻专家 更新时间:2023-10-31 20:32:31 24 4
gpt4 key购买 nike

我有以下用于 spark 作业的输入数据(在 Parquet 中):

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 解决这个问题?

最佳答案

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

关于java - Spark 数据帧加入范围慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40496514/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com