2017-06-17 484 views
0

我有一個場景,我想將格式爲Array [Row]的數據幀的結果轉換爲RDD [Row]。我嘗試過使用並行化,但我不想使用它,因爲它需要將整個數據包含在生產框中不可行的單個系統中。如何將Array [Row]轉換爲RDD [Row]

val Bid = spark.sql("select Distinct DeviceId, ButtonName from stb").collect() 
val bidrdd = sparkContext.parallelize(Bid) 

我該如何做到這一點?我嘗試了這個鏈接中給出的方法(How to convert DataFrame to RDD in Scala?),但它對我無效。

val bidrdd1 = Bid.map(x => (x(0).toString, x(1).toString)).rdd 

它給出了一個錯誤value rdd is not a member of Array[(String, String)]

回答

2

您在此處建立是一個數據幀的變量Bid,它是一個Array[Row],這就是爲什麼你不能用它.rdd。如果你想獲得一個RDD[Row],簡單地調用數據框.rdd(不叫collect):

val rdd = spark.sql("select Distinct DeviceId, ButtonName from stb").rdd 

您的文章包含了一些誤解,值得注意的是:

...一個數據幀是在格式數組[行] ...

不太 - 所述Array[Row]從DataFr收集數據的結果ame到驅動程序內存 - 它不是一個DataFrame。

...我不想,因爲它需要包含在一個單一的系統整個數據使用它......只要你對數據框使用collect

注意,你已經將全部數據收集到單個JVM的內存中。所以使用parallelize不是問題。

+0

謝謝Tzach,它工作。目前我正在處理測試數據,所以我使用了collect。最終的代碼將包含將結果保存到平面文件。 – ibh

+0

使用'collect'進行測試是有用和適當的,但要確保將測試與實際代碼分開 - 'collect'返回一個完全不同的類型,不能像「collect」未被調用那樣使用。 –