当前位置: 首页 > 知识库问答 >
问题:

将数据帧转换为 rdd 的成本

郭恩
2023-03-14

我尝试使用以下代码获取数据帧的分区数量:

df.rdd.getNumPartitions.toString

按照我的理解,dataframe通过元数据给rdd增加了一个结构层。那么,为什么在转换成rdd时要花这么多时间呢?

共有1个答案

郜驰
2023-03-14

数据帧是经过优化的分布式表格集合。由于它保留了表格格式(类似于SQL表),因此它可以维护元数据以允许在后台执行Spark一些优化。

此优化由催化剂和钨等附属项目执行

RDD不包含任何模式,它要求你提供一个如果需要的。所以RDD并不像数据帧那样高度优化,(完全不涉及催化剂)

将DataFrame转换为RDD强制Spark遍历所有元素,将它们从高度优化的Catalyst空间转换为scala空间。

检查 .rdd 中的代码

  lazy val rdd: RDD[T] = {
    val objectType = exprEnc.deserializer.dataType
    rddQueryExecution.toRdd.mapPartitions { rows =>
      rows.map(_.get(0, objectType).asInstanceOf[T])
    }
  }

@transient private lazy val rddQueryExecution: QueryExecution = {
    val deserialized = CatalystSerde.deserialize[T](logicalPlan)
    sparkSession.sessionState.executePlan(deserialized)
  }

首先,它执行计划并以< code>RDD[InternalRow]的形式检索输出,顾名思义,它仅供内部使用,需要转换为< code>RDD[Row]

然后,它遍历所有行并转换它们。如您所见,这不仅仅是删除模式

希望这能回答你的问题。

 类似资料:
  • 我正在尝试将RDD转换为数据帧,但失败并出现错误: org.apache.spark.SparkException:由于阶段失败而中止作业:阶段2.0中的任务0失败4次,最近一次失败:阶段2.0中丢失任务0.3(TID 11,10.139.64.5,执行器0) 这是我的代码:

  • 我正在尝试将RDD[String]转换为数据框。字符串是逗号分隔的,所以我希望逗号之间的每个值都有一列。为此,我尝试了以下步骤: 但我明白了: 这不是这篇文章的副本(如何将rdd对象转换为火花中的数据帧),因为我要求RDD[字符串]而不是RDD[行]。 而且它也不是火花加载CSV文件作为DataFrame的副本?因为这个问题不是关于将CSV文件读取为DataFrame。

  • 我有地图的RDD,我想把它转换成数据帧,这里是RDD的输入格式 有没有办法转换成数据帧像 df.show

  • 在从< code>RDD制作< code >数据帧时,我遇到了一个错误。 我收到以下错误: py spark . SQL . utils . parse exception:u " \ nmis matched input ' '应为{'SELECT ',' FROM ',' ADD ',' AS ',' ALL ',' DISTINCT ',' WHERE ',' GROUP ',' BY ',

  • RDD是以数组[数组[字符串]的格式创建的,具有以下值: 我想用模式创建一个数据帧: 接下来的步骤: 给出以下错误:

  • 我有一个如下的CSV文件。 我想把这个转化成下面。 基本上,我想在输出数据帧中创建一个名为idx的新列,该列将填充与键=idx,value=“n”后面的行相同的值“n”。