我想以拼花形式编写输出文件。为此,我将RDD转换为数据集,因为从RDD无法直接获得实木复合地板形式。对于创建数据集,我们需要使用隐式编码器,否则,它将开始产生编译时错误。我仅在这方面有几个问题。以下是我的代码:
include "math.iol"
include "console.iol"
main{
random@Math()(randomResult);
randomIndex= int (randomResult*10); // 10 is the maximum index size
println@Console(randomIndex)()
}
以下是我的问题:
因此,基本上它向我展示了object.toString()的一种值。
答案 0 :(得分:4)
createDataset
需要编码器才能将T
类型的JVM对象与内部Spark SQL表示形式相互转换。
基本上,编码器可以在JVM对象和Spark SQL的专用内部(表格)表示形式之间转换数据。 所有数据集都需要它们!
编码器是高度专业化和经过优化的代码生成器,可生成用于数据序列化和反序列化的自定义字节码。
我相信现在很清楚什么是编码器以及它们做什么。关于第二个问题,Kryo
序列化程序导致Spark 将数据集中的每一行存储为平面二进制对象。 而不是使用Java
或Kryo
序列化程序,可以使用Spark的内部编码器。您可以通过spark.implicits._
自动使用它。它也比Kryo
/ Java
序列化使用更少的内存。
更新我
根据您的评论,以下是将Spark编码器与常规Java
和Kryo
序列化(来自Heather Miller's Course的序列化)不同的地方:
对于原语和案例类,Spark SQL数据类型,
- 限于 最优。
- 它们包含架构信息,这些信息使这些高度优化的代码生成器成为可能,并能够根据数据的形状进行优化。由于Spark理解数据集中的数据结构,因此在缓存数据集时可以在内存中创建更优化的布局。
比Kryo
序列化要快- >快10倍(
Java
序列化要慢几个数量级)
希望对您有帮助!