将数据框投射到数据集后的选择是否进行了优化?

萨沙斯

我有以下情况:

 case class A(name:String,age:Int)
 val df = List(A("s",2)).toDF
 df.write.parquet("filePath")
 val result = spark.read.parquet("filePath").as[A].select("age")

以上是否经过优化只能选择age看到result.explain我看到以下

'Project [unresolvedalias('age, None)]
+- Relation[name#48,age#49] parquet

== Analyzed Logical Plan ==
age: int
Project [age#49]
+- Relation[name#48,age#49] parquet

== Optimized Logical Plan ==
Project [age#49]
+- Relation[name#48,age#49] parquet

== Physical Plan ==
*(1) FileScan parquet [age#49] Batched: true, Format: Parquet, Location:    InMemoryFileIndex[file:/Volumes/Unix/workplace/Reconciliation/src/TFSReconciliationCore/~/Downloa..., PartitionFilters: [], PushedFilters: [], ReadSchema: struct<age:int>

似乎只有age阅读。但是,目的是as什么呢?我看身体计划正确吗?

er喱

是的,您正在阅读正确。实木复合地板文件有两列-nameage

 Relation[name#48,age#49] parquet

但实际上,只有这样age才能被读取:

 Project [age#49]

但是,这样做有什么目的呢?

与上面的优化一样,Spark需要创建一个内部架构。

在某些情况下,例如parquet文件,我们有一个页脚,其中包含带有模式的元数据,尽管默认情况下,Spark必须读取所有页脚以合并可能的不同模式。
在其他(csvjson等)中,如果用户不提供架构,Spark需要扫描数据并创建它。

我们还需要一些通用容器,该容器将使我们能够访问这些值,并且有一个名为的容器Row

Row 是具有行的有序集合的通用行对象,可以通过序数/索引(也就是按序的通用访问),名称(即本机原始访问)或使用Scala的模式匹配来访问这些字段。

在您的示例中,编写以下代码完全可以:

spark.read.parquet("filePath").select("age")

read方法返回Dataframe,实际上只是一个Dataset of Rows
当我们使用时,as我们将转换Dataset[Row]几乎所有案例类Dataset[A]哪里A

在我看来,它使代码更整洁,更易读。在使用类似SQL的方法时,它并没有太大区别,但是当我们需要将map / flatMap或自定义聚合添加到组合中时,代码将变得更加易于理解。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

是否对克隆语句进行了优化?

数据集对新行进行了更改

Ubuntu是否针对多核CPU进行了优化?

数组是否在 jOOQ 和 PostgreSQL 中进行了优化?

OpenCV是否在调试模式下进行了优化?

如何确定Swift是否使用优化进行了编译

是否对JavaScript引擎尾部调用(TCO)进行了优化?

是否对if(0)和if(1)语句进行了优化?

Saxon XSLT 处理器是否针对将隧道参数设置为其当前值进行了优化?

无法将数据投射到字典中

无法将数据从NSKeyedUnarchiver投射到对象

针对循环python进行了优化

枚举时对核心数据进行了变异

SuiteCRM数据库在外部进行了修改

微观优化,是否已通过现代浏览器进行了优化?

我需要检查密码是否正确,但已在数据库中进行了哈希处理

如何检查我的应用程序是否已针对Android进行了电池优化配置?

Node.js:异步函数中是否对尾部调用进行了优化?

Kotlin的Float,Int等是否已针对JVM中的内置类型进行了优化?

Visual Studio是否针对超线程微处理器进行了优化?

是否仅对Azure表存储分区键查询进行了优化?

是否针对C标准进行了有条件的移动优化?

苹果是否已删除“针对iPhone 6和iPhone 6 Plus进行了优化”?

ML系列编译器是否对尾部调用进行了任何复杂的优化?

如何确定给定的表是否对内存进行了优化?

在XML文件中具有所有参数是否进行了优化?

是否对不使用模板参数的模板化类的方法进行了编译器优化?

内核是否进行了碎片整理

将int乘以30、31、32-编译器是否真的对它们进行了优化?(有效的Java这样说)