为spark RDD中的每个键创建唯一值

时间:2014-08-19 13:24:22

标签: apache-spark

我想创建一个key, value对的RDD,其中每个键都有一个唯一值。目的是“记住”密钥索引以供以后使用,因为密钥可能在分区周围进行混洗,并且基本上创建了各种查找表。我正在矢量化一些文本,需要创建特征向量,所以我必须为每个键都有一个唯一的值。

我尝试将第二个RDD压缩到我的RDD键,但问题是如果两个RDD没有以完全相同的方式进行分区,那么最终会丢失元素。

我的第二次尝试是使用像the one used in scikit-learn这样的哈希生成器,但我想知道是否还有其他“火花原生”的方法呢?我正在使用PySpark,而不是Scala ...

2 个答案:

答案 0 :(得分:3)

正如@aaronman所提到的那样,simple operation由于某种原因尚未进入pyspark api。关闭Java实现,这里似乎有用(但在每个分区上给出了连续排序的索引):

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

答案 1 :(得分:3)

zipWithIndexzipWithUniqueId刚刚添加到PySpark(https://github.com/apache/spark/pull/2092),将在即将发布的Spark 1.1.0版本中提供(它们目前在Spark中可用){ {1}}分支)。

如果您使用的是旧版本的Spark,那么您应该能够选择提交这些功能,因为我认为它只会向master添加行。