2017-04-03 89 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"); 
} 

} 
相关问题