2015-04-09 14 views
11

मैं एक समय विंडो में एकत्रित पाठ की पंक्तियों के साथ स्पार्क-स्ट्रीमिंग एप्लिकेशन में शीर्ष k शब्दों की गणना करना चाहता हूं।शीर्ष के शब्दों की गणना कैसे करें

मैं निम्नलिखित कोड के साथ समाप्त हो गया:

... 
val window = stream.window(Seconds(30)) 

val wc = window 
    .flatMap(line => line.split(" ")) 
    .map(w => (w, 1)) 
    .reduceByKey(_ + _) 

wc.foreachRDD(rdd => { 
    println("---------------------------------------------------") 
    rdd.top(10)(Ordering.by(_._2)).zipWithIndex.foreach(println) 
}) 
... 

यह काम करने के लिए लगता है।

समस्या: शीर्ष कश्मीर शब्द चार्ट foreachRDD समारोह प्रत्येक RDDreduceByKey द्वारा दिया (wc चर) पर एक शीर्ष + प्रिंट फ़ंक्शन निष्पादित कि का उपयोग कर की जाती है।

ऐसा लगता है कि reduceByKey रिटर्न एक भी RDD के साथ एक DStream, तो ऊपर दिए गए कोड काम करता है लेकिन सही व्यवहार चश्मा द्वारा इसकी गारंटी नहीं है।

क्या मैं गलत हूं, और यह सभी परिस्थितियों में काम करता है?

क्यों चिंगारी स्ट्रीमिंग में नहीं है, एक तरह से एक DStream एक भी RDD के रूप में विचार करने के लिए, RDD वस्तुओं का संग्रह करने के बजाय, आदेश और अधिक जटिल परिवर्तनों पर अमल करने में?

मेरा मतलब है कि एक कार्य है: dstream.withUnionRDD(rdd => ...) जो आपको एक एकल/संघ RDD पर परिवर्तन और क्रियाएं करने की अनुमति देता है। क्या ऐसी चीजों को करने का कोई समकक्ष तरीका है?

उत्तर

2

दरअसल मैंने कई आरडीडी से बना डीस्ट्रीम की अवधारणा को पूरी तरह से गलत समझा। एक डीस्ट्रीम कई आरडीडी द्वारा किया जाता है, लेकिन समय के साथ।

माइक्रो-बैच के संदर्भ में, डीस्ट्रीम वर्तमान आरडीडी से बना है।

तो, ऊपर दिया गया कोड हमेशा काम करता है।

संबंधित मुद्दे