我在HDFS上有简单的数据集,正在将其加载到Spark中。看起来像这样:
1 1 1 1 1 1 1
1 1 1 1 1 1 1
1 1 1 1 1 1 1
...
基本上是一个矩阵 我正在尝试实现一些需要对矩阵行进行分组的事情,因此,我试图为每一行添加一个唯一键,如下所示:
(1, [1 1 1 1 1 ... ])
(2, [1 1 1 1 1 ... ])
(3, [1 1 1 1 1 ... ])
...
我尝试了一些天真的尝试:设置全局变量并编写一个lambda函数以遍历全局变量:
# initialize global index
global global_index
global_index = 0
# function to generate keys
def generateKeys(x):
global_index+=1
return (global_index,x)
# read in data and operate on it
data = sc.textFile("/data.txt")
...some preprocessing...
data.map(generateKeys)
而且它似乎不认识全局变量的存在。
有没有想到的简单方法可以做到这一点?
谢谢杰克
>>> lsts = [
... [1, 1, 1, 1, 1, 1],
... [1, 1, 1, 1, 1, 1],
... [1, 1, 1, 1, 1, 1],
... [1, 1, 1, 1, 1, 1],
... [1, 1, 1, 1, 1, 1],
... [1, 1, 1, 1, 1, 1],
... [1, 1, 1, 1, 1, 2],
... [1, 1, 1, 2, 1, 2]
... ]
...
>>> list(enumerate(lsts))
[(0, [1, 1, 1, 1, 1, 1]),
(1, [1, 1, 1, 1, 1, 1]),
(2, [1, 1, 1, 1, 1, 1]),
(3, [1, 1, 1, 1, 1, 1]),
(4, [1, 1, 1, 1, 1, 1]),
(5, [1, 1, 1, 1, 1, 1]),
(6, [1, 1, 1, 1, 1, 2]),
(7, [1, 1, 1, 2, 1, 2])]
enumerate
为可迭代项中的每个项生成唯一索引,并生成具有值的元组 (index, original_item)
如果要使用以外的编号开始编号0
,请将起始值enumerate
作为第二个参数传递。
>>> list(enumerate(lsts, 1))
[(1, [1, 1, 1, 1, 1, 1]),
(2, [1, 1, 1, 1, 1, 1]),
(3, [1, 1, 1, 1, 1, 1]),
(4, [1, 1, 1, 1, 1, 1]),
(5, [1, 1, 1, 1, 1, 1]),
(6, [1, 1, 1, 1, 1, 1]),
(7, [1, 1, 1, 1, 1, 2]),
(8, [1, 1, 1, 2, 1, 2])]
请注意,list
用来获取实值,enumerate
该实值是从迭代器而不是函数返回列表的。
enumerate
易于使用,但是如果您需要在不同的代码段中添加id,它将变得困难或不可能。在这种情况下,可以使用全球可用的生成器(如OP中的绘图器)。
itertools
提供count
可以满足我们需求的产品:
>>> from itertools import count
>>> idgen = count()
现在,我们已经idgen
准备好(全球可用)生成器来生成唯一的ID。
我们可以通过一个函数prid
(打印ID)对其进行测试:
>>> def prid():
... id = idgen.next()
... print id
...
>>> prid()
0
>>> prid()
1
>>> prid()
2
>>> prid()
3
在工作时,我们可以在值列表上对其进行测试:
>>> lst = ['100', '101', '102', '103', '104', '105', '106', '107', '108', '109']
并定义实际函数,当使用值调用时将返回元组 (id, value)
>>> def assignId(val):
... return (idgen.next(), val)
...
注意,不需要声明idgen
为全局变量,因为我们不会更改其值(idgen
调用时只会更改其内部状态,但仍保持相同的生成器)。
测试是否可行:
>>> assignId("ahahah")
(4, 'ahahah')
并尝试在列表上:
>>> map(assignId, lst)
[(5, '100'),
(6, '101'),
(7, '102'),
(8, '103'),
(9, '104'),
(10, '105'),
(11, '106'),
(12, '107'),
(13, '108'),
(14, '109')]
enumerate
解决方案的主要区别在于,我们可以在代码中的任何位置一个一个地分配id,而无需在所有处理中全部完成enumerate
。
>>> assignId("lonely line")
(15, 'lonely line')
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句