簡體   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