如何优化此代码?如何让它快速。可以在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中找出每行之间的欧几里德距离。
答案 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']}
所有距离计算操作都是分布式的,所以它应该运行得更快,更快。