java—将Dataframe保存为文本文件而不使用databricks api

vlurs2pr  于 2021-05-29  发布在  Hadoop
关注(0)|答案(2)|浏览(412)

我不想使用databricks api,因为我们遇到的问题很少。
我想在Java1.7,Spark1.6.2中把df转换成rdd,从rdd转换成textfile
我想我的Dataframe保存为一个文本文件,我知道下面的代码工作,如果我们使用Java1.8

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

但是我试图用Java1.7输入上面相同的代码,但我无法获得正确的语法,因此使用了下面的代码。

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

        ?????

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

我不知道上面的代码是否正确。
请帮帮我,提前谢谢。

vhipe2zx

vhipe2zx1#

@问题就是这样解决的。
下面这段代码让我遇到了它所有超类的序列化问题,很少有类我无法更改它们。

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");
}

}
db2dz4w8

db2dz4w82#

将java 1.7与apache spark结合使用的正确语法如下所示:

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

在这里 Row ,即 org.apache.spark.sql.Row 是输入数据类型和 String 是输出数据类型。
这个 call 功能将需要 Row 作为输入参数并返回 String 作为输出。这就是为什么 callpublic String call(Row o) throws Exception {} .

相关问题