数据集上的地图功能是不是针对一列的操作进行了优化?

     2023-04-15     175

关键词:

【中文标题】数据集上的地图功能是不是针对一列的操作进行了优化?【英文标题】:Is map function on Datasets optimized for operations on one column?数据集上的地图功能是否针对一列的操作进行了优化? 【发布时间】:2016-08-29 22:17:11 【问题描述】:

对于DataFrame,使用udfdf.withColumn("newCol", myUDF("someCol")) 很容易通过一些操作生成一个新列。要在Dataset 中做这样的事情,我想我会使用map 函数:

def map[U](func: (T) ⇒ U)(implicit arg0: Encoder[U]): Dataset[U]

您必须将整个案例类 T 作为输入传递给函数。如果Dataset[T] 有很多字段/列,那么如果您只是想通过对T 的众多列之一进行操作来制作一个额外的列,那么传递整行似乎非常低效。我的问题是,Catalyst 是否足够聪明,能够对此进行优化?

【问题讨论】:

【参考方案1】:

Catalyst 是否足够聪明,能够对此进行优化?

tl;dr 不。见SPARK-14083 Analyze JVM bytecode and turn closures into Catalyst expressions。

目前 Spark SQL 的 Catalyst Optimizer 无法知道您在 Scala 代码中执行的操作。

引用SPARK-14083:

Dataset API 的一大优势是类型安全,但由于严重依赖用户定义的闭包/lambda,因此会以性能为代价。这些闭包通常比表达式慢,因为我们可以更灵活地优化表达式(已知数据类型,无虚函数调用等)。在许多情况下,查看这些闭包的字节码并弄清楚它们要做什么实际上并不难。如果我们能理解它们,那么我们就可以将它们直接转化为 Catalyst 表达式,以实现更优化的执行。

甚至提到了你的情况:

df.map(_.name) // 等价于表达式col("name")

如您所见,它仍处于打开状态,我怀疑目前是否有人从事此工作。


您可以帮助 Spark Optimizer 的方法是 select 那一列,然后才使用带有单参数 UDF 的 map 运算符。

这肯定符合您不将整个 JVM 对象传递给您的函数的要求,但不会摆脱这种从内部行表示到 Scala 对象的缓慢反序列化(这将落在 JVM 上并占用一些空间,直到GC 发生)。

【讨论】:

【参考方案2】:

我试图弄清楚自己,因为我在任何地方都找不到回应。

让我们有一个包含多个字段的案例类的数据集:

scala> case class A(x: Int, y: Int)
scala> val dfA = spark.createDataset[A](Seq(A(1, 2)))
scala> val dfX = dfA.map(_.x)

现在,如果我们检查优化后的计划,我们会得到以下信息:

scala> val plan = dfX.queryExecution.optimizedPlan

SerializeFromObject [input[0, int, true] AS value#8]
    +- MapElements <function1>, obj#7: int
        +- DeserializeToObject newInstance(class A), obj#6: A
           +- LocalRelation [x#2, y#3]    

根据更详细的plan.toJSONDeserializeToObject 步骤假定xy 都存在。

正如您所证明的那样,例如以下 sn-p 它使用反射而不是直接接触仍然有效的 A 的字段。

val dfX = dfA.map(
  _.getClass.getMethods.find(_.getName == "x").get.invoke(x).asInstanceOf[Int]
)

【讨论】:

hive里的优化和高级功能

  在一些特定的业务场景下,使用hive默认的配置对数据进行分析,虽然默认的配置能够实现业务需求,但是分析效率可能会很低。Hive有针对性地对不同的查询进行了优化。在Hive里可以通过修改配置的方式进行优化。  以下... 查看详情

基于针对另一列的参考表更新 Pandas 数据框列的问题

】基于针对另一列的参考表更新Pandas数据框列的问题【英文标题】:IssueWithUpdatingPandasDataframeColumnBasedonReferenceTableTargetingAnotherColumn【发布时间】:2018-06-1819:30:52【问题描述】:我有一个数据框,我正在尝试根据我在外部参考表中... 查看详情

确定图像存储是不是针对设备进行了优化

】确定图像存储是不是针对设备进行了优化【英文标题】:identifyingifimagestoreisoptimizedfordevice确定图像存储是否针对设备进行了优化【发布时间】:2015-07-0915:06:54【问题描述】:我正在使用ALAssetsLibrary访问照片。我的应用需要高... 查看详情

23、pandas的多列拼接成一列函数.str.cat()

参考技术A在数据处理时,常常需要将某一列进行拆分,分列,这个在之前的文章中已经总结过了,有str.split()、str.extract()、str.replace函数。不过有时候我们不仅仅需要将数据进行拆分,也还需要进行拼接操作。将不要的拆掉,再... 查看详情

在shell编程中,怎样对每一行每一列的数据进行操作?

比如我有一个200行6列的文本文件,需要对每行每列的数据进行操作,之后再写入到另一个文件中。问题是怎样取出数据呢(先对第一行的每一个数据进行操作,完成之后将结果保存到另一个文本文件中;对第二行数据进行同样... 查看详情

优化大数据集上的多对多关系查询

】优化大数据集上的多对多关系查询【英文标题】:Optimizingquerywithmany-to-manyrelationshiponbigdataset【发布时间】:2013-07-0316:39:15【问题描述】:我有一个使用类似DDL构建的数据库(SQLite):CREATETABLE[Player]([PlayerID]INTEGERPRIMARYKEYAUTOINCREMENT... 查看详情

lfw 数据集上的 vgg16 不获取 RGB

】lfw数据集上的vgg16不获取RGB【英文标题】:vgg16onlfwdatasetDontgetRGB【发布时间】:2020-10-0817:37:05【问题描述】:我想在LFW数据集上使用Keras库中的VGGNET-16进行人脸识别。但是生成的是灰度而不是RGB,我无法更改它:【问题讨论】... 查看详情

autoaugment

AutoAugment:LearningAugmentationStrategiesfromDataSummary区别与传统数据增强方法。本文提出了一种自动化搜索优化的数据增强策略的方法AutoAugment实际应用中直接应用于兴趣数据集耗费太大,一般尝试迁移其他数据集的数据增强策略精简Imag... 查看详情

clickhouse入门(代码片段)

ClickHouse是俄罗斯的Yandex于2016年开源的列式存储数据库(DBMS),使用C++语言编写,主要用于在线分析处理查询(OLAP),能够使用SQL查询实时生成分析数据报告一、ClickHouse的特点1、列式存储以下... 查看详情

clickhouse入门(代码片段)

ClickHouse是俄罗斯的Yandex于2016年开源的列式存储数据库(DBMS),使用C++语言编写,主要用于在线分析处理查询(OLAP),能够使用SQL查询实时生成分析数据报告一、ClickHouse的特点1、列式存储以下... 查看详情

数据集上的 avg() 是不是产生最有效的 RDD?

】数据集上的avg()是不是产生最有效的RDD?【英文标题】:Doesavg()onadatasetproducethemostefficientRDD?数据集上的avg()是否产生最有效的RDD?【发布时间】:2020-01-0221:35:28【问题描述】:据我了解,这是在Spark中计算平均值的最有效方法... 查看详情

贝壳教你uipath之数据的抓取

...,选择取所要抓取数据的其中第一列出现提示框,问我们是不是需要抓取所有数据。我们点是,那么UiPath 完成这个数据流程,如果我们选yes 奖保存表的所有治疗。这里我们选n。又出现叫你选择第二个表格项这里有两种... 查看详情

如何在 Spark Java 中的数据集上应用地图功能

】如何在SparkJava中的数据集上应用地图功能【英文标题】:Howtoapplymapfunctionondatasetinsparkjava【发布时间】:2016-12-1308:35:57【问题描述】:我的CSV文件:YEAR,UTILITY_ID,UTILITY_NAME,OWNERSHIP,STATE_CODE,AMR_METERING_RESIDENTIAL,AMR_METERING_COMMERCIAL,AMR_... 查看详情

excel如何查询一个数据是不是在某一列中

参考技术A1、打开电脑,打开新建一个excel表格输入两列数据用于对比,C列输入对比结果;2、这是用b列的每一个数据对比a列的所以数据,然而这里用到函数COUNTIF();3、这个函数用来做这件事情比较上手,这是对一个区域符合条... 查看详情

大容量倾斜数据集上的 Hive 排序操作

】大容量倾斜数据集上的Hive排序操作【英文标题】:Hivesortoperationonhighvolumeskeweddataset【发布时间】:2019-08-0113:21:11【问题描述】:我正在Hortonworks2.6.5上处理一个大小约为3TB的大型数据集,数据集的布局非常简单。数据的层次结... 查看详情

TCP 之上是不是有针对高吞吐量和低延迟进行优化的协议/标准?

】TCP之上是不是有针对高吞吐量和低延迟进行优化的协议/标准?【英文标题】:Arethereanyprotocols/standardsontopofTCPoptimizedforhighthroughputandlowlatency?TCP之上是否有针对高吞吐量和低延迟进行优化的协议/标准?【发布时间】:2009-09-0416:5... 查看详情

消除视觉transformer与卷积神经网络在小数据集上的差距

...力和其进行通道多样性表征的能力,弥补了Transformer在小数据集上从头训练的精度与传统的卷积神经网络之间的差距。本文分享自华为云社区《​​[NeurIPS2022]消除视觉Transformer与卷积神经网络在小数据集上的差距​​》,作者:H... 查看详情

Mysql:优化使用一列或另一列的查询

...发布时间】:2021-03-1407:26:32【问题描述】:该表包含聊天数据,其中from_user_id和to_user_id列均已单独正确编入索引。我的查询是获取特定用户参与的所有聊天消息,即SELECT*FROMchatWHEREfrom_user_id=123ORto_use 查看详情