优化Pyspark代码以快速运行

时间:2018-04-20 17:46:48

标签: python apache-spark optimization pyspark rdd

如何优化此代码?如何让它快速。可以在Spark Distributed空间中执行减法吗?这里Rdd是一个词典集合

all_actors =["brad", "tom", "abc", "def"]
init_actors=["tom", "abc"]

for i in all_actors:

        dc={}
        d1=bj.filter(lambda x: x['actor']==i).first()
        for j in init_actors:
            d2=centroids.filter(lambda x: x['actor']==j).first()
            dc={key: (d1[key] - d2[key])**2 for key in d1.keys() if key not in 'actor'}
            val=sum([v for v in dc.values()])
            val=math.sqrt(val)

rdd.take(2)

[{'actor': 'brad',
  'good': 1,
  'bad': 0,
  'average': 0,}
 {'actor': 'tom',
  'good': 0,
  'bad': 1,
  'average': 1,}]

这个Rdd在每个字典中有大约30,000个键。这只是一个样本。

预期产出:

在RDD中找出每行之间的欧几里德距离。

1 个答案:

答案 0 :(得分:1)

我知道你需要all_actors中所有元素与init_actors

之间的所有距离

我认为你应该做笛卡尔积,然后制作地图以获得所有距离。

all_actors =["brad", "tom", "abc", "def"]
init_actors=["tom", "abc"]

# Create cartesian product of tables
d1=bj.filter(lambda x: x['actor'] in all_actors)
d2=centroids.filter(lambda x: x['actor'] in init_actors)
combinations = d1.cartesian(d2)

然后你只应用计算距离的地图函数(我不确定布局笛卡尔结果有什么,所以你必须弄清楚calculate_cartesian应该怎么样)。

combinations.map(calculate_euclidean)       

编辑:我用google搜索笛卡儿产生的对(x,y) - x和y的类型与所有/ init_actors的元素相同 - 所以你可以创建函数:

def calculate_euclidean(x, y):
    dc={key: (x[key] - y[key])**2 for key in x.keys() if key not in 'actor'}
    val=sum([v for v in dc.values()])
    val=math.sqrt(val)

    #returning dict, but you can change result row layout if you want
    return {'value': val,
            'actor1': x['actor']
            'actor2': y['actor']}

所有距离计算操作都是分布式的,所以它应该运行得更快,更快。