如何在spark中将rdd数据一分为二?

Posted

技术标签:

【中文标题】如何在spark中将rdd数据一分为二?【英文标题】:how to divide rdd data into two in spark? 【发布时间】:2014-11-15 07:46:53 【问题描述】:

我在 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。 rdd1rdd2 每次都应该是随机的。我试过这样:

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: unhashable type: 'dict'

【问题讨论】:

【参考方案1】:

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://***.com/a/32971246/1560062。

您不能将subtract 与字典一起使用,因为它在内部表示为cogorup,因此需要对象为hashable。另见A list as a key for PySpark's reduceByKey

【讨论】:

以上是关于如何在spark中将rdd数据一分为二?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 ipython 中将 Spark RDD 转换为 pandas 数据帧?

如何在 ipython 中将 Spark RDD 转换为 pandas 数据帧?

如何在 Spark 中将两个 RDD[string] 合并在一起?

如何在spark(Python)中将两个rdd组合成on rdd

如何在 Spark Streaming 中将 RDD 转换为 DataFrame,而不仅仅是 Spark

如何在 Spark 中将 Avro Schema 对象转换为 StructType