不使用 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 中的 dbutils.fs.ls 输出创建数据框