簡體   English   中英

如何使用“ for”循環在Spark-Streaming的DStream中進行轉換和輸出?

[英]How can I use 'for' loop to do Transformation and Output in Spark-Streaming's DStream?

我是Spark的新秀,並且使用定義的類生成了1000個不同的實例(這些實例中的函數相同,但詳細函數的參數不同)。 sampler=generateClass()然后我需要將那些實例的函數映射到我的Stream。(要測試,只需使用10和2個實例)

s=[]
for i in range(10):        
    s.append(mappedStream.map(lambda x: sampler[i].insert(x)).reduce(min))

uStream=ssc.union(s[0],s[1],s[2],s[3],s[4],s[5],s[6],s[7],s[8],s[9])
uStream.pprint()

但是它的輸出只有10個相同的鍵值對,看來這些代碼只是將我的數據映射到第一個實例,然后重復10次。

(85829323L, [2, 1])
(85829323L, [2, 1])
(85829323L, [2, 1])
(85829323L, [2, 1])
....

那我試試

myStream1=mappedStream.map(lambda x: sampler[0].insert(x)).reduce(min)
myStream2=mappedStream.map(lambda x: sampler[1].insert(x)).reduce(min)
ssc.union(myStream1,myStream2).pprint()

輸出正確:

(85829323L, [2, 1])
(99580454L, [4, 1])

為什么會這樣? 我該如何處理呢? 非常感謝你。

發生這種情況是因為python lambda是惰性計算的,並且當您對s[0]調用操作時,它會使用最后一個i參數進行計算(在您的情況下為9 ,這是最后一個循環值)。

您可以使用函數生成器模式通過適當的i來“強制”執行,例如:

def call_sampler(i):
    return lambda x: sampler[i].insert(x)

s=[]
for i in range(10):        
    s.append(mappedStream.map(call_sampler(i)).reduce(min))

uStream=ssc.union(s[0],s[1],s[2],s[3],s[4],s[5],s[6],s[7],s[8],s[9])
uStream.pprint()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM