首页 文章

PySpark 按值分解密钥并保留 LDA 模型的重复项

提问于
浏览
1

我有元组的 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 回答

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

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

  • 0

    从我的头顶

    .map(lambda x: x[0])
    

    但是不在有火花的机器附近

  • 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中的每个orig_list_item(本身就是列表),我们将做同样的事情:

    for item, count in orig_list_item
    

    我们将解开其中每一对的各个部分的包装(分别给它们命名为itemcount-例如,对于第一对,它们将为item == u'11394071'count == 1)。

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

    [item]
    

    并将重复count

    [item] * count
    

    不幸的是,我们将获得一个列表列表,内容如下(来自您第二个更有趣的 sub-list)

    [['11847272', '11847272'], ['999999'], ['11847272', '11847272', '11847272']]
    

    因此我们需要将它们组合(连接)成一个简单的列表-导入的模量itertools的函数(类方法)

    itertools.chain.from_iterable()
    

    会为我们做到的。

    但是-不幸的是-更高版本的Python(我认为是Python 2.7)中的此函数会生成生成器,而不是列表-因此,我们最终将使用 built-in 函数list()获得所需的列表。

  • 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
    

相关问题