Use*_*523 3 apache-spark pyspark
我正在尝试使用PySpark在Spark作业中创建自定义分区程序,例如,我有一些整数列表[10,20,30,40,50,10,20,35]。现在,我需要一个场景,其中有两个分区,分别是p1和p2。p1包含所有<30的列表元素,而p2包含30以上的所有元素。
elements = sc.parallelize([10,20,30,40,50,10,20,35]).map(lambda x : (float(x)/10,x)).partitionBy(2).glom().collect()
Run Code Online (Sandbox Code Playgroud)
上面的代码根据我传递的任意键的哈希值对列表进行分区。无论如何,是否有根据特定场景对列表进行分区的信息?像值小于x或类似的东西?
背负FaigB的答案,如果值大于阈值,而不是值本身,您想分区。这是在python中的样子
rdd = sc.parallelize([10,20,30,40,50,10,20,35]).map(lambda x : (float(x)/10, float(x)/10))
elements = rdd.partitionBy(2,lambda x: int(x > 3)).map(lambda x: x[0]).glom().collect()
elements
Run Code Online (Sandbox Code Playgroud)
导致
[[1.0, 2.0, 3.0, 1.0, 2.0], [4.0, 5.0, 3.5]]
Run Code Online (Sandbox Code Playgroud)
首先将您的条目与键本身映射((10,10),(20,20))以获得元组键值对。然后使用自定义分区器,它将根据键值决定要转到哪个分区元素。
尝试在 python 中实现这样的类:
class ExactPartitioner[V](partitions: Int, elements: Int) extends Partitioner {
def getPartition(key: Any): Int = {
val k = key.asInstanceOf[Int]
//0 and 1 are partition number
return ( k < 30 )? 0 : 1
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3240 次 |
| 最近记录: |