为什么在Spark中创建数据集需要编码器

时间:2018-12-27 18:43:40

标签: scala apache-spark

我想以拼花形式编写输出文件。为此,我将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)()
 }

以下是我的问题:

  1. 为什么在创建数据集时使用编码器很重要?这个编码器做什么?
  2. 从上面的代码中,当我得到实木复合地板形式的输出文件时,我看到了它的编码形式。如何解码?当我使用base64格式对其进行解码时,得到以下信息: com ......... processor.spark.ItemDat“ 0156028263

因此,基本上它向我展示了object.toString()的一种值。

1 个答案:

答案 0 :(得分:4)

来自documentation

  

createDataset需要编码器才能将T类型的JVM对象与内部Spark SQL表示形式相互转换。

来自Heather Miller's course

  

基本上,编码器可以在JVM对象和Spark SQL的专用内部(表格)表示形式之间转换数据。 所有数据集都需要它们!

     

编码器是高度专业化和经过优化的代码生成器,可生成用于数据序列化和反序列化的自定义字节码。

我相信现在很清楚什么是编码器以及它们做什么。关于第二个问题,Kryo序列化程序导致Spark 将数据集中的每一行存储为平面二进制对象。 而不是使用JavaKryo序列化程序,可以使用Spark的内部编码器。您可以通过spark.implicits._自动使用它。它也比Kryo / Java序列化使用更少的内存。

更新我

根据您的评论,以下是将Spark编码器与常规JavaKryo序列化(来自Heather Miller's Course的序列化)不同的地方:

  
      对于原语和案例类,Spark SQL数据类型,
  • 限于 最优
  •   
  • 它们包含架构信息,这些信息使这些高度优化的代码生成器成为可能,并能够根据数据的形状进行优化。由于Spark理解数据集中的数据结构,因此在缓存数据集时可以在内存中创建更优化的布局。
  •   比Kryo序列化要快
  • >快10倍Java序列化要慢几个数量级)
  •   

希望对您有帮助!