不使用 databricks API 将数据框保存为文本文件

Posted

技术标签:

【中文标题】不使用 databricks API 将数据框保存为文本文件【英文标题】:Saving a dataframe as text file without using 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");

我不知道上面的代码是否正确。

请帮助我,在此先感谢。

【问题讨论】:

【参考方案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");



【讨论】:

以上是关于不使用 databricks API 将数据框保存为文本文件的主要内容,如果未能解决你的问题,请参考以下文章

使用pyspark,spark + databricks时如何将完全不相关的列添加到数据框中

在 Databricks PySpark 中本地保存文件

从 Databricks 中的 dbutils.fs.ls 输出创建数据框

Databricks:将数据框合并到 Azure 突触表中

如何在 Databricks 中使用 Python 将数据框数组拆分为列

无法使用 pySpark 从 Databricks 在 Cosmos DB/documentDB 中写入数据帧