2017-08-03 38 views
0

我使用PySpark並且遇到一些麻煩,如果RDD包含長字符串,爲什麼合併兩個RDD會失敗。用長字符串合併兩個RDD將數值的順序混合起來

特別是,我有兩個RDDS與結構

RDD1集=(KEY1,[string11,string12]],[KEY2,[string21,string22]],...)

RDD2 =(KEY1,[string13,string14,string15]],[KEY2,[string23,string24,string25]],...)

其中字符串可以變得相當長(即,它們是價值幾MB)。我的最終目的是要得到一個新的 「合併和扁平」 RDD與內容

rdd3 =(KEY1,string11,string12,string13,string14,string15],[KEY2,string21,string22,string23,string24 ,string25],...)

爲此我使用Python命令

rdd3 = sparkContext.union([rdd1, rdd2]).groupByKey() \ 
     .mapValues(lambda x: list(x)).map(lambda x: [x[0]] + list(x[1][0]) + list(x[1][1])) 

這似乎是一個簡單的任務,實際上,此命令效果很好,如果字符串是小的。然而,對於非常長字符串所得RDD的順序被突然混合起來在一個看似隨機的方式等

rdd3 =(KEY1,string14,string15,string12,string13,string11],[KEY2,string21, string22,string24,string25,string23],...)

雖然union似乎維持秩序,必須某處groupByKeymap之間發生混合。我認爲扁平化似乎不成問題。但由於groupByKey返回ResultIterable,很難弄清細節。總而言之,我不知道這裏發生了什麼。任何人都可以給我一個提示嗎?我目前正在本地測試客戶端上運行Spark,只有少數工作人員,如果這很重要的話。

回答

1

這裏發生的是洗牌。洗牌期間的操作順序是不確定的。在某些情況下,可以保留順序,但不能保證順序,並且僅限於簡單的情況,例如本地模式。

除非在每次洗牌之後保留附加的訂單信息和度假村值(非常昂貴),否則沒有解決方法。