Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 优化Pyspark代码以快速运行_Python_Apache Spark_Optimization_Pyspark_Rdd - Fatal编程技术网

Python 优化Pyspark代码以快速运行

Python 优化Pyspark代码以快速运行,python,apache-spark,optimization,pyspark,rdd,Python,Apache Spark,Optimization,Pyspark,Rdd,如何优化此代码?如何使它快速。减法可以在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: d

如何优化此代码?如何使它快速。减法可以在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.take2

[{'actor': 'brad',
  'good': 1,
  'bad': 0,
  'average': 0,}
 {'actor': 'tom',
  'good': 0,
  'bad': 1,
  'average': 1,}]
这个Rdd在每个字典中大约有30000多个键。这只是一个样本

预期产出:


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

我知道您需要来自所有参与者的元素之间的所有距离以及来自初始参与者的所有距离

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

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)
然后你只需应用计算距离的映射函数,我不确定笛卡尔的布局结果是什么,所以你必须弄清楚计算笛卡尔应该是什么样子

combinations.map(calculate_euclidean)       
编辑:我在谷歌上搜索到cartesian生成的成对行x、y-x和y与所有/init_参与者的元素类型相同,所以您可以创建函数:

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']}

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

如果键不在“名称”中,我认为这可能是一个逻辑问题,是“参与者”更新的,我仍然会这么说。在字符串中可能不是您想要的。要么检查集合列表、集合、字典中是否有内容,要么检查j是否相等==。我不明白你的支票是怎么回事。这段代码在pyspark之外能给你想要的输出吗?不要优化不起作用的东西。这段代码在pyspark中为我提供了所需的输出。但这需要很多时间和记忆。