将数据框保存为文本文件而不使用数据框API
问题描述:
我不想使用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");
我不知道上面的代码是否正确。
请帮我从这里,在此先感谢。
答
使用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 {}
。
答
@合成 这是如何解决问题。
这下面的和平代码跑到我的所有超类的序列化问题,有几个类,我不能改变它们。
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");
}
}
感谢您的更新人士Himanshu的创建。我已经尝试过,但我得到的任务没有序列化的错误,为此,我实现了可序列化的接口,仍然得到相同的问题引起:org.apache.spark.SparkException:任务不可序列化 – BadBoy777
你能提供错误堆栈跟踪? – himanshuIIITian
没关系。序列化问题是固定的,当我创建一个单独的类而不是匿名类。谢谢:) – BadBoy777