优化Pyspark代码以运行fas

2024-04-18 06:28:47 发布

您现在位置:Python中文网/ 问答频道 /正文

如何优化此代码?如何让它快点。减法可以在Spark分布空间中进行吗?这里的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公司(二)

^{pr2}$

这个Rdd在每个字典中有大约30000多个键。这只是一个样本。在

预期产量:

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


Tags: keyinfor字典initactorsvalall
1条回答
网友
1楼 · 发布于 2024-04-18 06:28:47

我知道你需要所有元素之间的所有距离

我认为你们应该做笛卡尔积,然后制作地图来得到所有的距离。在

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)

然后你只需要应用计算距离的map函数(我不确定笛卡尔的布局结果是什么,所以你必须弄清楚calculate泳ucaltesian应该是什么样子)。在

^{pr2}$

编辑:我在谷歌上搜索到笛卡尔产生的成对行(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']}

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

相关问题 更多 >