2016-12-02 82 views
0

以下是我用於將數據幀寫入JSON的代碼。我從飛艇上運行此代碼:無法將火花數據幀寫入json文件

val df = Seq((2012, 8, "Batman", 9.8), (2012, 8, "Hero", 8.7), (2012, 7, "Robot", 5.5), (2011, 7, "Git", 2.0)).toDF("year", "month", "title", "rating") 
df.write.json("/tmp/out.json") 

我想到的是寫在/tmp/out.json文件數據幀的數據。然而,它是創建名稱爲「/tmp/out.json」目錄裏面,我覺得以下兩個文件:

_SUCCESS 
._SUCCESS.crc 

這些文件都不是有JSON數據。我在這裏錯過了什麼?

+1

是你運行一個集羣還是隻在本地?如果集羣是否檢查了執行程序上的輸出目錄,而不是在驅動程序機器上? – ImDarrenG

+0

@ImDarrenG我可以在執行器上看到json數據。它被分割成執行者。有沒有辦法讓一個json文件中的所有json數據? –

+0

是的,有可能,請參閱:http://stackoverflow.com/a/40594798/7098262 – Mariusz

回答

0

你有一些選擇:

  • 寫入共享位置,(不使用星火辦合併)
  • df.rdd.collect()數據到驅動器合併文件,並寫入文件。您將使用標準的Scala io庫,因此不會有任何分區。這有一個缺點,就是不得不將所有數據從執行程序提取到驅動程序,根據數據量和驅動程序資源的不同,速度可能很慢或不可行。
  • 比收集整個數據集更好的方法是收集反過來每個分區和流數據到一個文件上的驅動程序

如:

val rdd = df.rdd 
for (p <- rdd.partitions) { 
    val idx = p.index 
    val partRdd = rdd.mapPartitionsWithIndex(a => if (a._1 == idx) a._2 else Iterator(), true) 
    //The second argument is true to avoid rdd reshuffling 
    val data = partRdd.collect //data contains all values from a single partition 
           //in the form of array 
    //Now you can do with the data whatever you want: iterate, save to a file, etc. 
} 

https://stackoverflow.com/a/21801828/4697497