我对PySpark比较陌生。
我有2M列车实例和4M测试实例。每个实例由id和特征向量表示。我有一个自定义函数来计算两对实例之间的相似性。
作为输出,我想要每个测试实例,列车实例的排名顺序。这是一个非常常见的问题,但实例的数量是挑战。
因为,我必须进行全对比比较,我在PySpark中使用了with open('output.txt','w') as f:
retcode = subprocess.call('tar xvd Test.tar', stdout=f, stderr=f)
产品函数,如下所示:
cartesian
在,train_testpairs_simscores中,我有以下类型的元组:
train_testpairs = trainRDD.cartesian(testRDD)
train_testpairs_simscores = train_testpairs.map(myscore)
但是,现在我想要每个测试实例的列车实例的排序顺序,例如:
(train_id,test_id,score)
据我所知,对于每个test_id,这将有一个2M大小的列表。因此,拥有此列表的n%也可以。最接近测试ID的前1000列车实例。
我怎样才能做到这一点?
我试图通过testID进行分组,然后在每个列表中进行排序,但 test_id1,[train_id432, train_id832,.....]
本身太耗时。
任何帮助将不胜感激。
答案 0 :(得分:0)
面对一个非常类似的问题,我最终手动计算了相似度得分'而不是使用cartesian()
:
def f(train_instance):
return train_instance,sorted(myscore(train_instance,test_instance) for test_instance in TEST_INSTANCES)
trainRDD.map(f)
这样你就可以避免扩展2m * 4m项目的笛卡尔积,然后重新组合它们