Apache spark 为spark RDD中的每个键创建唯一值
我想创建一个包含Apache spark 为spark RDD中的每个键创建唯一值,apache-spark,Apache Spark,我想创建一个包含键、值对的RDD,其中每个键都有一个唯一的值。这样做的目的是“记住”键索引以备将来使用,因为键可能会在分区周围乱序,基本上创建一个排序的查找表。我正在对一些文本进行矢量化,需要创建特征向量,因此我必须为每个关键点设置唯一的值 我尝试将第二个RDD压缩到我的RDD密钥中,但问题是如果两个RDD的分区方式不完全相同,那么最终会丢失元素 我的第二次尝试是使用散列生成器,比如,但我想知道是否有其他“spark native”方法可以做到这一点?我用的是PySpark,不是Scala 正如
键、值
对的RDD,其中每个键都有一个唯一的值。这样做的目的是“记住”键索引以备将来使用,因为键可能会在分区周围乱序,基本上创建一个排序的查找表。我正在对一些文本进行矢量化,需要创建特征向量,因此我必须为每个关键点设置唯一的值
我尝试将第二个RDD压缩到我的RDD密钥中,但问题是如果两个RDD的分区方式不完全相同,那么最终会丢失元素
我的第二次尝试是使用散列生成器,比如,但我想知道是否有其他“spark native”方法可以做到这一点?我用的是PySpark,不是Scala 正如@aaronman所提到的,由于某些原因,这是一个尚未进入pyspark api的应用程序。在Java实现之外,下面是一些似乎有效的方法(但给出了每个分区上具有连续顺序的索引):
zipWithIndex
和zipWithiUniqueId
刚刚添加到PySpark()中,将在即将发布的Spark 1.1.0版本中提供(它们目前在Sparkmaster
分支中提供)
如果您使用的是旧版本的Spark,您应该能够选择提交,以便对这些函数进行后端口,由于我认为它只会在
rdd.py
中添加行,可能是这样的感谢@aaronman--但这似乎不是pyspark的一个选项?哦,这很烦人,在这种情况下,我建议您查看一下,看看是否可以在python中实现等效的行,它似乎并不坏感谢您的提示,我将发布我的解决方案作为答案。我想为每个项目创建唯一的键,而不是唯一的值,这段代码非常有用。
def count_partitions(id, iterator):
c = sum(1 for _ in iterator)
yield (id,c)
def zipindex(l, indices, k) :
start_index = indices[k]
for i,item in enumerate(l) :
yield (item,start_ind+i)
> parts = rdd.mapPartitionsWithSplit(count_partitions).collectAsMap()
> indices = parts.values()
> indices.append(0,0)
> rdd_index = rdd.mapPartitionsWithIndex(lambda k,l: zipindex(l,indices,k))