我有两个 RDD 说

   rdd1 =
id            | created     | destroyed | price
1            | 1            | 2            | 10
2            | 1            | 5            | 11
3            | 2            | 3            | 11
4            | 3            | 4            | 12
5            | 3            | 5            | 11

rdd2 =

[1,2,3,4,5] # lets call these value as timestamps (ts)

rdd2 基本上是使用 range(intial_value, end_value, interval) 生成的。这里的参数可能会有所不同。大小可以与 rdd1 相同或不同。这个想法是使用过滤标准根据 rdd2 的值将记录从 rdd1 提取到 rdd2(来自 rdd1 的记录可以在提取时重复,正如您在输出中看到的那样)

过滤条件 rdd1.created
预期输出:
ts             | prices
1              | 10,11       # i.e. for ids 1,2 of rdd1
2              | 11,11       # ids 2,3
3              | 11,12,11    # ids 2,4,5
4              | 11,11       # ids 2,5

现在我想根据 使用 RDD2 的键的某些条件过滤 RDD1。 (如上所述) 并返回连接RDD2的键和RDD1的过滤结果的结果

所以我这样做:
rdd2.map(lambda x : somefilterfunction(x, rdd1))

def somefilterfunction(x, rdd1):
    filtered_rdd1 = rdd1.filter(rdd1[1] <= x).filter(rdd1[2] > x)
    prices = filtered_rdd1.map(lambda x : x[3])
    res = prices.collect()
    return (x, list(res))

我得到:



我尝试使用 groupBy ,但由于这里 rdd1 的元素可以一次又一次地重复,而我理解的分组会将 rdd1 的每个元素都放在某个特定的插槽中一次。

现在唯一的方法是使用普通的 for 循环并进行过滤并最终加入所有内容。

有什么建议么?

最佳答案

由于您使用常规范围,因此根本没有理由创建第二个 RDD。您可以简单地为每条记录生成特定范围内的值:

from __future__ import division # Required only for Python 2.x
from math import ceil
from itertools import takewhile

rdd1 = sc.parallelize([
    (1, 1, 2, 10),
    (2, 1, 5, 11),
    (3, 2, 3, 11),
    (4, 3, 4, 12),
    (5, 3, 5, 11),
])


def generate(start, end, step):
    def _generate(id, created, destroyed, price):
        # Smallest ts >= created
        start_for_record = int(ceil((created - start) / step) * step + start)
        rng = takewhile(
            lambda x: created <= x < destroyed,
            xrange(start_for_record, end, step)) # In Python 3.x use range
        for i in rng:
            yield i, price

    return _generate

result = rdd1.flatMap(lambda x: generate(1, 6, 1)(*x)).groupByKey()

结果:
result.mapValues(list).collect()

## [(1, [10, 11]), (2, [11, 11]), (3, [11, 12, 11]), (4, [11, 11])]

关于python - Spark - 嵌套的 RDD 操作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33257461/

10-10 22:22