我正在尝试随机化RDD中元素的顺序。我目前的方法是使用洗牌整数的RDD压缩元素,然后通过这些整数加入。
但是,pyspark只有1亿个整数。我正在使用下面的代码。
我的问题是:是否有更好的方法可以使用随机索引进行压缩或以其他方式进行随机播放?
我尝试使用随机密钥进行排序,但这很慢。
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
答案 0 :(得分:5)
一种可能的方法是使用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_with_keys
# partition by random key to put data on random partition
.partitionBy(n)
# Sort partition by random value to ensure random order on partition
.mapPartitions(sorted, preservesPartitioning=True)
# Extract (unique_id, value) pairs
.values())
如果每个分区的排序仍然很慢,可以用Fisher-Yates shuffle代替。
如果您只需要随机数据,则可以使用mllib.RandomRDDs
from pyspark.mllib.random import RandomRDDs
RandomRDDs.uniformRDD(sc, n)
理论上它可以使用输入rdd
进行压缩,但需要匹配每个分区的元素数量。
答案 1 :(得分:-1)
pyspark有效!
$submit = initRequestValue('Submit');
//my initPostValue allows me to take post value by name