我是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的方式? foreachPartition
和aggregate
似乎不太合适。
答案 0 :(得分:0)
我认为您所说的dataset.get
大致对应于join
。我已经使用pyspark和RDD对以上代码进行了粗略的翻译。 f1
和f2
是您的两个功能。您可以使用数据框执行非常类似的操作。
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))]
有不同类型的联接,例如内部联接和外部联接,但是我希望这足以为您指明正确的方向。