SPARK中的自定义分区(pyspark)

Use*_*523 3 apache-spark pyspark

我正在尝试使用PySpark在Spark作业中创建自定义分区程序,例如,我有一些整数列表[10,20,30,40,50,10,20,35]。现在,我需要一个场景,其中有两个分区,分别是p1p2p1包含所有<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或类似的东西?

Dav*_*vid 7

背负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)


Fai*_*igB 4

首先将您的条目与键本身映射((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)