Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala Spark数据帧和数据集之间的编码器差异_Scala_Apache Spark_Apache Spark Sql - Fatal编程技术网

Scala Spark数据帧和数据集之间的编码器差异

Scala Spark数据帧和数据集之间的编码器差异,scala,apache-spark,apache-spark-sql,Scala,Apache Spark,Apache Spark Sql,当阅读Spark的DataFrame(它是Dataset[Row]的别名)和Dataset之间的差异时,经常提到Dataset利用编码器高效地将JVM对象转换为Spark的内部数据表示。在scala中,为case类和基元类型提供了隐式编码器。然而,我相信还有一种方法可以实现数据帧中行的编码 我的问题是 就JVM对象和Spark内部二进制表示之间的高效转换而言,DataFrames和Datasets的性能是否相同 就编码(序列化/反序列化)而言,特定类型(如Scala中的case类)在泛型行上提供

当阅读Spark的
DataFrame
(它是
Dataset[Row]
的别名)和
Dataset
之间的差异时,经常提到
Dataset
利用
编码器
高效地将JVM对象转换为Spark的内部数据表示。在scala中,为case类和基元类型提供了隐式编码器。然而,我相信还有一种方法可以实现数据帧中
行的编码

我的问题是

  • 就JVM对象和Spark内部二进制表示之间的高效转换而言,
    DataFrame
    s和
    Dataset
    s的性能是否相同
  • 就编码(序列化/反序列化)而言,特定类型(如Scala中的case类)在泛型
    上提供了哪些额外的好处?除了编译时类型安全之外,类型化JVM对象是否比半类型(或“非类型”)
    有任何优势

  • 数据帧只是带有Spark Row类编码器的数据集。因此,数据帧本质上是一个数据集

    编码器也不会起作用,除非您使用的是非列函数(采用类似于lambda的map、reduce、flatmap的函数)。当您使用其中一个函数时,由于catalyst无法优化lambda,因此将codegen分为两部分,这将对性能造成影响。这意味着您可能根本不想使用这些函数,并且可以完全忽略数据集/数据帧的差异,因为如果不使用这些函数,您将永远不会编码

    根据我的经验,使用数据集和类型API可以获得的类型安全性的好处不值得付出巨大的性能代价。在几乎所有情况下,我发现您都应该留在数据帧中,只使用基于列的函数和UDF以获得最佳性能


    另外需要注意的是,使用编码器的唯一其他时间是在并行化集合时,所有数据源都将提供要Spark的行或内部行,因此编码器不会用于大多数源。

    数据帧只是带有Spark Row类编码器的数据集。因此,数据帧本质上是一个数据集

    编码器也不会起作用,除非您使用的是非列函数(采用类似于lambda的map、reduce、flatmap的函数)。当您使用其中一个函数时,由于catalyst无法优化lambda,因此将codegen分为两部分,这将对性能造成影响。这意味着您可能根本不想使用这些函数,并且可以完全忽略数据集/数据帧的差异,因为如果不使用这些函数,您将永远不会编码

    根据我的经验,使用数据集和类型API可以获得的类型安全性的好处不值得付出巨大的性能代价。在几乎所有情况下,我发现您都应该留在数据帧中,只使用基于列的函数和UDF以获得最佳性能


    另外需要注意的是,使用编码器的唯一其他时间是当您并行化集合时,所有数据源都将提供行或内部行来触发,因此您的编码器不会用于大多数源。

    DS还不够成熟。可能需要添加示例和比较。我已经投了赞成票。帮助all@RussS谢谢你的回答。您说过“如果不使用这些函数,可以忽略dataframe/dataset之间的差异”。但是,在使用编码器的情况下,这些区别是什么呢。如果我有一个具有已定义模式和等效数据集的数据帧,那么这两个不同If的编码器是如何工作的呢。使用强类型的case类和泛型行编码有什么优势吗?我无法想象有什么显著的区别。一旦达到序列化边界,您就要付出巨大的代价,并保留内部行格式(worth)。这一成本使您编码到IMHO中的对象的特殊性相形见绌。@BluePhantom就是一个例子,而且dataset API相当成熟。正如我之前所说,Dataframe是一种特定类型的数据集,它实际上是Dataset[Row]DS的类型别名,但还不够成熟。可以添加一个示例和比较。我已经投了赞成票。帮助all@RussS谢谢你的回答。您说过“如果不使用这些函数,可以忽略dataframe/dataset之间的差异”。但是,在使用编码器的情况下,这些区别是什么呢。如果我有一个具有已定义模式和等效数据集的数据帧,那么这两个不同If的编码器是如何工作的呢。使用强类型的case类和泛型行编码有什么优势吗?我无法想象有什么显著的区别。一旦达到序列化边界,您就要付出巨大的代价,并保留内部行格式(worth)。这一成本使您编码到IMHO中的对象的特殊性相形见绌。@BluePhantom就是一个例子,而且dataset API相当成熟。正如我之前所说,数据帧是一种特定类型的数据集,它实际上是Dataset[Row]的类型别名