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
Apache spark 在spark中将数据帧转换为rdd的成本_Apache Spark_Apache Spark Sql_Rdd - Fatal编程技术网

Apache spark 在spark中将数据帧转换为rdd的成本

Apache spark 在spark中将数据帧转换为rdd的成本,apache-spark,apache-spark-sql,rdd,Apache Spark,Apache Spark Sql,Rdd,我尝试使用以下方法获取数据帧的分区数: df.rdd.getNumPartitions.toString 但是,当我监控spark日志时,我看到它会旋转很多阶段,这是一项成本高昂的操作。 据我所知,dataframe通过元数据向rdd添加了一个结构层。那么,为什么在转换为rdd时要花这么多时间来剥离数据帧呢?数据帧是一个优化的分布式表格集合。因为它保持了表格格式(类似于SQL表),所以它可以保存元数据,以允许在后台执行一些优化 此优化由诸如和之类的项目端执行 RDD不包含任何模式,如果需要,

我尝试使用以下方法获取数据帧的分区数:

df.rdd.getNumPartitions.toString
但是,当我监控spark日志时,我看到它会旋转很多阶段,这是一项成本高昂的操作。


据我所知,dataframe通过元数据向rdd添加了一个结构层。那么,为什么在转换为rdd时要花这么多时间来剥离数据帧呢?

数据帧是一个优化的分布式表格集合。因为它保持了表格格式(类似于SQL表),所以它可以保存元数据,以允许在后台执行一些优化

此优化由诸如和之类的项目端执行

RDD不包含任何模式,如果需要,您需要提供一个模式。因此,RDD没有数据帧那么高的优化程度(根本不涉及Catalyst)

将数据帧转换为RDD迫使Spark循环所有元素,将它们从高度优化的Catalyst空间转换为scala空间

检查
.rdd

lazy-val-rdd:rdd[T]={
val objectType=exprEnc.deserializer.dataType
rddQueryExecution.toRdd.mapPartitions{rows=>
rows.map(u.get(0,objectType).asInstanceOf[T])
}
}
@临时私有惰性值rddQueryExecution:QueryExecution={
val反序列化=CatalystSerde.deserialize[T](logicalPlan)
sparkSession.sessionState.executePlan(反序列化)
}
因此,首先,它执行计划并以
RDD[InternalRow]
的形式检索输出,顾名思义,它仅用于内部使用,需要转换为
RDD[Row]

然后它在所有行上循环转换它们。正如您所看到的,它不仅仅是删除模式


希望能回答你的问题

啊,好的。那么,你的意思是说这个时间与数据帧的体积成正比?另外,如果我还想知道数据帧的分区数,有没有办法避免这种开销?您可以尝试先缓存数据帧,这样在将其转换为RDD之前就可以计算它。我想这至少会有点帮助。这能回答你的问题吗。阿尔索