为啥 DataFrame 在 spark 2.2 中仍然存在,甚至 DataSet 在 scala 中也提供了更多的性能? [复制]
Posted
技术标签:
【中文标题】为啥 DataFrame 在 spark 2.2 中仍然存在,甚至 DataSet 在 scala 中也提供了更多的性能? [复制]【英文标题】:why DataFrame still there in spark 2.2 also even DataSet gives more performance in scala? [duplicate]为什么 DataFrame 在 spark 2.2 中仍然存在,甚至 DataSet 在 scala 中也提供了更多的性能? [复制] 【发布时间】:2019-01-03 09:59:00 【问题描述】:DataSet 比 dataframe 提供最好的性能。 DataSet 提供编码器和类型安全,但数据帧仍在使用中是否存在任何特定场景,仅在该场景中使用数据帧,或者是否有任何函数在数据帧上工作而不在数据集中工作。
【问题讨论】:
这是一个很好的观点,但遗憾的是,仍然有太多的 Spark 功能是像 Spark ML 一样使用 Dataframe 作为主要 api 构建的。看看typelevel.org/frameless。 我不知道为什么人们在不理解我在问什么的情况下标记为重复。@user6910411 我没有问数据框和数据集之间的区别。 @EmiCareOfCell44 我不关心 MLIB ...在 Spark ML 中没有可用的数据集。 看看 Spark ML 阶段,例如转换器和估算器。它们都使用 Dataframe 类型,Dataset[Row]。如果您使用自定义转换器或其他高级功能,对它们进行抽象并非易事 【参考方案1】:Dataframe
实际上是一个Dataset[Row]
。
它还具有许多与之相关的工具和功能,可以使用Row
而不是通用的Dataset[SomeClass]
这为DataFrame
带来了直接的优势,即无需自己编写即可使用这些工具和功能。
DataFrame
实际上比Dataset
享有更好的性能。这样做的原因是 Spark 可以理解与 DataFrame
相关的内置函数的内部结构,这使得 Catalyst 优化(重新排列和更改执行树)以及执行全阶段代码生成以避免大量虚拟化。
另外,在编写Dataset functions
时,需要构造相关的对象类型(例如案例类)(包括复制)。这可能是开销,具体取决于使用情况。
Dataframe
的另一个优点是它的架构是在运行时而不是在编译时设置的。这意味着,例如,如果您从 parquet 文件中读取,则模式将由文件的内容设置。这可以处理动态情况(例如执行 ETL)
可能还有更多的原因和优势,但我认为这些是重要的。
【讨论】:
如果你使用 HDFS(parquet..) 你有模式,但如果你没有,你必须包含它。并且在运行时拥有架构会导致运行时错误,您在编译时无法检测到,我认为这没有任何优势。 @EmiCareOfCell44 ETL 是 spark 的标准用法。您不一定知道架构。当有额外的扩展字段时也是如此。因为您不能真正将“AnyValue”或抽象类作为成员,所以除了最严格的模式定义之外,您将遇到任何问题。这方面的用例比我想象的还要多…… 确实会出现问题。但我更愿意让编译阶段帮助我进行这些架构更改并避免 Spark 检测某些 Spark SQL 函数调用中的错误。 Spark 在这个领域有很多工作要做以上是关于为啥 DataFrame 在 spark 2.2 中仍然存在,甚至 DataSet 在 scala 中也提供了更多的性能? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
使用带有 Spark 版本 2.2 的 row_number() 函数在 PySpark DataFrame 中创建每一行的行号
为啥 Spark DataFrame 会创建错误数量的分区?
为啥使用 DataFrame 时 Spark 会报告“java.net.URISyntaxException:绝对 URI 中的相对路径”?