我在Spark RDD中有一个数据,我想把它分成两部分,比如0.7。例如,如果RDD看起来像这样:
[1,2,3,4,5,6,7,8,9,10]
我想将其分为rdd1
:
[1,2,3,4,5,6,7]
和rdd2
:
[8,9,10]
,比例为0.7。 rdd1
和rdd2
每次都应该是随机的。我试过这种方式:
seed = random.randint(0,10000)
rdd1 = data.sample(False,scale,seed)
rdd2 = data.subtract(rdd1)
它有时有效,但当我的数据包含dict
时,我遇到了一些问题。例如,数据如下:
[{1:2},{3:1},{5:4,2;6}]
我得到了
TypeError:不可用类型:' dict'
答案 0 :(得分:5)
RDDs
rdd = sc.parallelize(range(10))
test, train = rdd.randomSplit(weights=[0.3, 0.7], seed=1)
test.collect()
## [4, 7, 8]
train.collect()
## [0, 1, 2, 3, 5, 6, 9]
和DataFrames
df = rdd.map(lambda x: (x, )).toDF(["x"])
test, train = df.randomSplit(weights=[0.3, 0.7])
提供randomSplit
方法,可在此处使用。
备注强>:
randomSplit
使用单个filter
表示每个输出RDD
。通常,不可能从单个Spark转换中产生多个RDDs
。有关详细信息,请参阅https://stackoverflow.com/a/32971246/1560062。
您不能将subtract
与字典一起使用,因为在内部表达cogorup
,因此要求对象为hashable
。另请参阅A list as a key for PySpark's reduceByKey