2017-04-03 83 views
1

我不想使用databricks API,因爲我們遇到了幾個問題。將數據框保存爲文本文件而不使用數據框API

我想如果我們使用的DF轉換爲RDD和RDD在Java 1.7到文本文件,星火1.6.2

我希望我的數據幀,以保存爲一個文本文件,我知道下面的代碼工作Java的1.8

df.rdd.map(row => row.mkString("\t")).coalesce(1).saveAsTextFile("outputDirRdd") 

但我嘗試把同樣的上面的代碼與Java 1.7我無法得到正確的語法與下面的代碼擊中。

df.toJavaRDD().map(new Function<???,???>() { 
     public ??? call(?? input) throws Exception { 

     ????? 

     } 
    }).coalesce(1).saveAsTextFile("/s/filelocation"); 

我不知道上面的代碼是否正確。

請幫我從這裏,在此先感謝。

回答

1

使用Java 1.7與Apache火花所提到的用例的正確語法如下:

df.toJavaRDD().map(new Function<Row, String>() { 
        @Override 
        public String call(Row o) throws Exception { 
         return o.mkString("\t"); 
        } 
       }).coalesce(1).saveAsTextFile("/s/filelocation"); 

這裏,這是org.apache.spark.sql.Row是輸入數據的類型和String是輸出數據類型。

call函數將把作爲輸入參數並返回String作爲輸出。這就是爲什麼call的簽名是public String call(Row o) throws Exception {}

+0

感謝您的更新人士Himanshu的創建。我已經嘗試過,但我得到的任務沒有序列化的錯誤,爲此,我實現了可序列化的接口,仍然得到相同的問題引起:org.apache.spark.SparkException:任務不可序列化 – BadBoy777

+0

你能提供錯誤堆棧跟蹤? – himanshuIIITian

+0

沒關係。序列化問題是固定的,當我創建一個單獨的類而不是匿名類。謝謝:) – BadBoy777

0

@合成 這是如何解決問題。

這下面的和平代碼跑到我的所有超類的序列化問題,有幾個類,我不能改變它們。

df.toJavaRDD().map(new Function<Row, String>() { 
       public String call(Row v1) throws Exception { 
        return v1.mkString("\t"); 
       } 
      }).saveAsTextFile("/s/filelocation"); 

因此,對於該解決方法是如下:

df.toJavaRDD().map(new SeprateCls).saveAsTextFile("/s/filelocation"); 

下面的代碼是seprateCls

public class SeprateCls implements Function<Row, String>{ 

private static final long serialVersionUID = -635027754589291L; 

public String call(Row v1) throws Exception { 
    return v1.mkString("\t"); 
} 

} 
相關問題