【问题标题】:Saving a dataframe as text file without using databricks API不使用 databricks API 将数据框保存为文本文件
【发布时间】:2017-04-03 17:00:44
【问题描述】:

我不想使用 databricks API,因为我们遇到了一些问题。

我想在 java 1.7、Spark 1.6.2 中将 DF 转换为 RDD 并从 RDD 转换为 textfile

我希望我的数据框保存为文本文件,因为我知道如果我们使用 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 hadoop apache-spark apache-spark-sql spark-dataframe


    【解决方案1】:

    对于上述用例,将 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 作为输出。这就是为什么call 的签名是public String call(Row o) throws Exception {}

    【讨论】:

    • 感谢 himanshu 的更新。我已经尝试过了,但是我得到了任务未序列化的错误,为此我实现了可序列化的接口,但仍然遇到同样的问题原因:org.apache.spark.SparkException:任务不可序列化
    • 你能提供错误堆栈跟踪吗?
    • 没关系。当我创建一个单独的类而不是匿名类时,序列化问题得到了修复。谢谢:)
    • @BadBoy777 您是否有一个您创建的类的示例,可以为遇到相同问题的其他人修复它?
    【解决方案2】:

    @Synthe 问题就这样解决了。

    下面的代码让我遇到了所有超类的序列化问题,并且有几个类我无法更改它们。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-10-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-03
      • 2018-10-25
      相关资源
      最近更新 更多