Python Pyspark:shuffleRDD

Python Pyspark:shuffleRDD,python,hadoop,apache-spark,bigdata,pyspark,Python,Hadoop,Apache Spark,Bigdata,Pyspark,我试图随机排列RDD中元素的顺序。我目前的方法是用一个无序整数的RDD压缩元素,然后用这些整数连接 然而,pyspark只包含100000000个整数。我正在使用下面的代码 我的问题是:有没有更好的方法可以使用随机索引压缩或以其他方式洗牌 我尝试过用随机键进行排序,虽然有效,但速度很慢 def random_indices(n): """ return an iterable of random indices in range(0,n) """ indices

我试图随机排列RDD中元素的顺序。我目前的方法是用一个无序整数的RDD压缩元素,然后用这些整数连接

然而,pyspark只包含100000000个整数。我正在使用下面的代码

我的问题是:有没有更好的方法可以使用随机索引压缩或以其他方式洗牌

我尝试过用随机键进行排序,虽然有效,但速度很慢

def random_indices(n):
    """
    return an iterable of random indices in range(0,n)
    """
    indices = range(n)
    random.shuffle(indices)
    return indices
pyspark中会发生以下情况:

Using Python version 2.7.3 (default, Jun 22 2015 19:33:41)
SparkContext available as sc.
>>> import clean
>>> clean.sc = sc
>>> clean.random_indices(100000000)
Killed

一种可能的方法是使用
mapParitions

import os
import numpy as np

swap = lambda x: (x[1], x[0])

def add_random_key(it):
    # make sure we get a proper random seed
    seed = int(os.urandom(4).encode('hex'), 16) 
    # create separate generator
    rs = np.random.RandomState(seed)
    # Could be randint if you prefer integers
    return ((rs.rand(), swap(x)) for x in it)

rdd_with_keys = (rdd
  # It will be used as final key. If you don't accept gaps 
  # use zipWithIndex but this should be cheaper 
  .zipWithUniqueId()
  .mapPartitions(add_random_key, preservesPartitioning=True))
接下来,您可以重新分区、对每个分区进行排序并提取值:

n=rdd.getNumPartitions()
(rdd_带_键
#通过随机键进行分区,将数据放在随机分区上
.分区人(n)
#按随机值对分区进行排序,以确保分区上的随机顺序
.mapPartitions(已排序,保留分区=True)
#提取(唯一的\u id,值)对
.values())
如果每个分区的排序仍然很慢,那么可以用Fisher-Yates shuffle代替

如果您只是需要一个随机数据,那么您可以使用
mllib.RandomRDDs

从pyspark.mllib.random导入RandomRDDs
RandomRDDs.uniformRDD(sc,n)
理论上,它可以通过输入
rdd
压缩,但它需要匹配每个分区的元素数。

pyspark有效

来自随机导入范围
data\u rnd=data.sortBy(λx:randrange(1000000))

谢谢,这很有用。我真的需要钥匙是独一无二的。你还有其他要求吗?因为如果没有,您可以在之后简单地
zipWithIndex
zipWithiUniqueId
。它增加了另一个转换,但不是非常昂贵。我需要的密钥是随机排序和唯一的。我可以按随机键进行排序,但这被证明是相当慢的。如果是这样,您可以在洗牌之前添加索引或id。我已经更新了答案。嗯,说实话和分类没什么不同。虽然不需要直方图,但您必须洗牌几乎相同数量的数据。如果需要一个真正的随机顺序,我怀疑有什么办法可以避免它。