Pyspark:扩展数据集以包括邻居

时间:2019-01-11 14:25:32

标签: python apache-spark pyspark

我是Spark的新手,正在尝试将现有的python应用程序迁移到pyspark。

第一个函数之一(应称为f(x))应针对数据集中的每个元素运行,但也应考虑数据集中的其他元素。

我能得到的最好的简化是以下伪代码:

    def f(x, dataset):
        elem1 = dataset.get(somefunction(x))
        elem2 = dataset.get(someotherfunction(x))
        return (x,(elem1, elem2))

    def main(dataset):
        result = []
        for x in dataset:
            result.append(f(x,dataset))

是否有一种类似Spark的方式? foreachPartitionaggregate似乎不太合适。

1 个答案:

答案 0 :(得分:0)

我认为您所说的dataset.get大致对应于join。我已经使用pyspark和RDD对以上代码进行了粗略的翻译。 f1f2是您的两个功能。您可以使用数据框执行非常类似的操作。

data = spark.range(10).rdd.map(lambda row: (row[0], row[0] * 10))

def unNest(nested):
  key, ((v1, v2), v3) = nested
  return key, (v1, v2, v3)

def f1(a): return a + 1
def f2(a): return a - 1

one = data.map(lambda pair: (f1(pair[0]), pair[1]))
two = data.map(lambda pair: (f2(pair[0]), pair[1]))
data.join(one).join(two).map(unNest).take(10)

# [(1, (10, 0, 20)),
#  (2, (20, 10, 30)),
#  (3, (30, 20, 40)),
#  (4, (40, 30, 50)),
#  (5, (50, 40, 60)),
#  (6, (60, 50, 70)),
#  (7, (70, 60, 80)),
#  (8, (80, 70, 90))]

有不同类型的联接,例如内部联接和外部联接,但是我希望这足以为您指明正确的方向。