我想创建一个key, value
对的RDD,其中每个键都有一个唯一值。目的是“记住”密钥索引以供以后使用,因为密钥可能在分区周围进行混洗,并且基本上创建了各种查找表。我正在矢量化一些文本,需要创建特征向量,所以我必须为每个键都有一个唯一的值。
我尝试将第二个RDD压缩到我的RDD键,但问题是如果两个RDD没有以完全相同的方式进行分区,那么最终会丢失元素。
我的第二次尝试是使用像the one used in scikit-learn这样的哈希生成器,但我想知道是否还有其他“火花原生”的方法呢?我正在使用PySpark,而不是Scala ...
答案 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)
zipWithIndex
和zipWithUniqueId
刚刚添加到PySpark(https://github.com/apache/spark/pull/2092),将在即将发布的Spark 1.1.0版本中提供(它们目前在Spark中可用){ {1}}分支)。
如果您使用的是旧版本的Spark,那么您应该能够选择提交这些功能,因为我认为它只会向master
添加行。