2016-07-28 24 views
0

我玩弄JavaPariRDD。我參與的競拍等待結果列於我的信息單擊鏈接沒有看到相關新聞發表評論訪問我們。我有一個pairRDD,其中APL,IBM as 密碼,其交易交易配至。像這樣的東西(這裏提供的虛擬數據)如何獲得單獨的RDD爲每個鍵進入

(NYSE IBM 2001年12月27日122.7 123.93 122.64 123.5 3826200 111.65)

(NYSE APL 2001年12月27日12.75 12.93 12.64 12.5 11.65 3826200)

現在我遇到的情況,我需要有單獨的RDD爲每個鍵。我立即選擇是filter()

sBookRdd = sourceRDD.filter(new MyFilter("IBM")); 
sBookRdd = sourceRDD.filter(new MyFilter("APL")); 

如果我有單獨的RDD每個公司/ StockName,我可以進行公司具體分析,什麼不是。 我在這裏的問題是,他們的任何其他更好的方法爲我的情況?

+1

如果你能清楚地告訴需求,人們將能夠提出更好的方案。爲什麼你想要很多RDD?你想用RDD做什麼,你不能用單個RDD做什麼? – rakesh

+0

更新了我的問題。@ rakesh – BDR

回答

1

星火不支持RDD嵌套所以沒有簡單的方法來破解一個RDD成許多RDDS沒有中間的動作。你應該採取的方法取決於你想完成什麼。

如果你絕對需要RDD每個鍵,那麼你可以重新分區的數據,寫出來,使得每個分區的文件很容易識別,然後啓動多個職位來處理每個分區。我不會推薦這種方法。

如果你可以逃脫Iterable那麼你可以使用groupBy或更有效的表親aggregate。僅使用字符串作爲值,很難想象爲什麼迭代器不能滿足您的需求並需要RDD ...

您還應該考慮您需要做什麼可以使用dataframe/dataset API使用窗口函數(您將按鍵分區)。

希望這會有所幫助!

+0

正如您所提到的,使用聚合檢查。 – BDR

0

RDD是在火花的核心抽象用於封裝所分發的數據(最有可能跨機器)。儘管它支持許多列表/可迭代方法,但將RDD用作迭代/列表是錯誤的。

注意:RDD上的任何轉換都是懶惰的,任何對RDD的操作都將由執行程序並行執行(可能位於相同/不同的jvms & &或||機器中)。現在,如果要求是一次處理具有相同密鑰的所有記錄(可以說是「NYSE IBM」),那麼您將不得不做一些如下的事情,我正在使用Scala寫作,您可以找到相當於java的 -

val input = Array("NYSE IBM 2001-12-27 122.7 123.93 122.64 123.5 3826200 111.65", "NYSE APL 2001-12-27 12.75 12.93 12.64 12.5 3826200 11.65") 
val rdd = sc.parallelize(input) 
val groupedRdd = rdd.groupBy(line => methodWhichReturnsKeyFromEachLine(line)) 
groupedRdd.foreach(group=>processGroup(group)) //If you want to process all lines in a group without returning any result 
groupedRdd.map(group=>processGroup(group)) //If you want to process all lines in a group and return some result per group 

希望這有助於!

+0

GroupBy()不是我的選擇,因爲它的洗牌數據。 – BDR

+0

你的意思是,你不允許使用任何洗牌操作!這在使用火花時似乎是一個很大的限制。任何特定的原因? – rakesh

+0

aggregatebyKey()似乎適用於我所提到的@Sim – BDR

相關問題