PySpark按值扩展密钥并保留LDA模型的重复项

时间:2017-08-02 17:31:53

标签: python python-2.7 apache-spark pyspark lda

我有一个元组的RDD。我想爆炸键值对并保留重复项。基本上是关键的x值。我想将这个RDD数组提供给LDA模型。我将在下面说明一些代码,提前谢谢你:

当前状态

>>> rdd4.take(2)
[ [(u'11394071', 1), (u'11052103', 1), (u'11052101', 1)],
[(u'11847272', 2), (u'999999', 1), (u'11847272', 3)] ]

首选州

>>> rdd4.take(2)
[ ['11394071','11052103','11052101'],
['11847272', '11847272','999999','11847272','11847272','11847272'] ]

4 个答案:

答案 0 :(得分:1)

不使用列表理解的解决方案,可能更清楚:

import itertools

orig_list = rdd4.take(2)

result = []
for orig_list_item in orig_list:
    inner_result = []
    for item, count in orig_list_item:
        inner_result.append([item] * count)
    inner_result = itertools.chain.from_iterable(inner_result)
    inner_result = list(inner_result)
    result.append(inner_result)

解释实际上与我的其他答案相同。

答案 1 :(得分:0)

脱离我的头顶

.map(lambda x: x[0])

不靠近有火花的机器

答案 2 :(得分:0)

import itertools

orig_list = rdd4.take(2)

result = [list(itertools.chain.from_iterable([[item] * count for item, count in orig_list_item]))
          for orig_list_item in orig_list]

print result的输出:

[['11394071', '11052103', '11052101'],  
 ['11847272', '11847272', '999999', '11847272', '11847272', '11847272']]

解释:

它被称为(有点复杂)列表理解 - 从右边读取它:

for orig_list_item in orig_list

很明显,不是吗?在orig_list_item中,每个orig_list(本身就是一个列表),我们都会做同样的事情:

for item, count in orig_list_item

我们将解压缩每对中的各个部分(分别为它们指定itemcount - 例如,对于第一对,它将是item == u'11394071',{{ 1}})。

现在我们创建此项目的列表

count == 1

并将重复[item]

count

不幸的是,我们将获得一个列表列表,从(第二个,更有趣的子列表)

[item] * count

所以我们需要将它们(连接)组合成一个简单的列表 - 导入的模数[['11847272', '11847272'], ['999999'], ['11847272', '11847272', '11847272']] 的函数(类方法)

itertools

将为我们制作。

但是 - 不幸的是 - 在itertools.chain.from_iterable() 的更高版本(我认为来自Python)中的此功能会生成生成器,而不是列表 - 所以我们最后使用内置函数Python 2.7来获得所需的列表。

答案 3 :(得分:0)

使用函数并保留RDD:

def explode_list(data):
    inner_result = []
    for item, count in data:
        inner_result.append([item] * count)
    flatten_result = [xx for yy in inner_result for xx in yy]
    return flatten_result