将元素添加到 python pyspark 中的列表列表

adding element to a list of list in python pyspark

我有一个包含学生数据结构的列表 - [('100', 'class 1'), ('110', 'class 2'), ('1030', 'class 2'),.....]。我使用这个命令得到的这个结构:

student_class = student.map(lambda x:x).zip(class)

现在我想将学生分数添加到上面列表列表的每个元素中,这样输出就变成了:

[('100', 'class 1',score1), ('110', 'class 2',score2), ('1030', 'class 2',score3),.....]

学生的分数显示在名为 score 的列表中。我如何将分数添加到上面的 student_class 列表中以使其成为 student_classScore 列表?

由于您有 listtuple 并且 tuple 是不可变的,因此您需要通过将现有元组与单元素元组集中来创建一个新元组(由 (score,) 创建),然后将新创建的元组附加到新列表。

l = [('100', 'class 1'), ('110', 'class 2'), ('1030', 'class 2')]
scores = [1, 2, 3]
new_list = []
for tup, score in zip(l, scores):
    new_list.append(tup + (score,))

print new_list
>> [('100', 'class 1', 1), ('110', 'class 2', 2), ('1030', 'class 2', 3)]

另一种但不那么pythonic但概念相同的方法:

for index, tup in enumerate(l):
    l[index] = tup + (scores[index],)
print l
>> [('100', 'class 1', 1), ('110', 'class 2', 2), ('1030', 'class 2', 3)]

由于您使用的是 spark,因此您也可以在 spark 中使用 zipmap 来附加分数。

student_RDD = sc.parallelize(['100', '110', '1030'])
class_RDD = sc.parallelize(['class1', 'class2', 'class2'])
score_RDD = sc.parallelize([1, 2, 3])

student_class_RDD = student_RDD.zip(class_RDD) # There is no need to map first
student_class_RDD.zip(score_RDD).map(lambda x: x[0] + (x[1],)).collect()

输出:

[('100', 'class1', 1), ('110', 'class2', 2), ('1030', 'class2', 3)]

我觉得用spark方案比单纯的python方案更合适,尤其是数据量大的时候,这就是你用spark的原因吧?