繁体   English   中英

在Spark中使用Lambda进行列表转换

[英]List Transformation With Lambdas in Spark

我正在尝试采用包含成对的整数范围的RDD,并对其进行转换,以使每个对都具有第三个术语,该术语对范围内的可能值进行迭代。 基本上,我有这个:

[[1,10], [11,20], [21,30]]

最后,我想这样:

[[1,1,10], [2,1,10], [3,1,10], [4,1,10], [5,1,10]...]

我要转换的文件非常大,这就是为什么我希望使用PySpark而不是仅在本地计算机上使用Python来执行此操作的原因(我有一种方法可以在CSV文件上本地进行处理,但是根据文件的大小,此过程需要几个小时)。 到目前为止,我已经知道了:

a = [[1,10], [11,20], [21,30]]
b = sc.parallelize(a)
c = b.map(lambda x: [range(x[0], x[1]+1), x[0], x[1]])
c.collect()

产生:

>>> c.collect()
[[[1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 1, 10], [[11, 12, 13, 14, 15, 16, 17, 18, 19, 20], 11, 20], [[21, 22, 23, 24, 25, 26, 27, 28, 29, 30], 21, 30]]

我无法弄清楚下一步需要做什么,以便在扩展的范围内进行迭代,并将每一个与范围定界符配对。

有任何想法吗?

编辑5/8/2017 3:00 PM

适用于CSV输入的本地Python技术是:

import csv
import gzip
csvfile_expanded = gzip.open('C:\output.csv', 'wb')
ranges_expanded = csv.writer(csvfile_expanded, delimiter=',', quotechar='"')
csvfile = open('C:\input.csv', 'rb')
ranges = csv.reader(csvfile, delimiter=',', quotechar='"')
for row in ranges:
    for i in range(int(row[0]),int(row[1])+1):
         ranges_expanded.writerow([i,row[0],row[1])

我要询问的PySpark脚本从已经加载到HDFS并转换为RDD的CSV文件开始。

尝试这个:

c = b.flatMap(lambda x: ([y, x[0], x[1]] for y in xrange(x[0], x[1]+1)))

flatMap()确保范围内的每个元素获得一条输出记录。 还要注意将外部( )xrange结合使用-这是一个生成器表达式,可以避免在执行程序的内存中实现整个范围。

注意: xrange()是Python2。 如果您正在运行Python3,请使用range()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM