我假设Spark数据帧是从RDD构建的。然而,我最近了解到情况并非如此,Spark中DataFrame、Dataset和RDD之间的差异很好地解释了它们并非如此。
那么,将RDD转换为数据帧并再次转换的开销是多少呢?它是微不足道的还是重要的?
在我的应用程序中,我通过将文本文件读入RDD来创建DataFrame,然后使用返回Row()
对象的map函数自定义编码每一行。我不应该这样做吗?有更有效的方法吗?
RDD在Spark中扮演着双重角色。首先是内部数据结构,用于跟踪各个阶段之间的更改,以管理故障;其次,直到Spark 1.3成为与用户交互的主要界面。因此,after Spark 1.3数据帧构成了主界面,提供了比RDD更丰富的功能。
使用df将一个数据帧转换为RDD时,没有显著的开销。rdd由于数据帧已经初始化了其rdd的一个实例,因此返回对该rdd的引用不应该有任何额外的成本。另一方面,从RDD生成数据帧需要一些额外的工作。有两种方法可以通过调用RDD将RDD转换为数据帧1st。toDF(),第二个带火花。createDataFrame(rdd,模式)。虽然在模式验证和执行计划方面会有额外的开销,但这两种方法的计算都是延迟的(有关更多详细信息,请查看这里的代码)。当然,这与使用spark初始化数据所产生的开销是相同的。阅读文本(…) 但只需少一步,即可将RDD转换为数据帧。
这是我直接使用数据帧而不是使用两个不同的Spark接口的第一个原因。
第二个原因是,在使用RDD接口时,您缺少一些数据帧和数据集提供的与Spark optimizer(catalyst)和内存管理(Wongth)相关的重要性能特性。
最后,只有当我需要数据帧中缺少的一些功能时,我才会使用RDDs接口,例如键值对、zipWithIndex函数等,但即使这样,您也可以通过df访问这些功能。如前所述,rdd是无成本的。就您的情况而言,我认为直接使用数据帧并使用该数据帧的映射功能来确保Spark利用钨丝的使用来确保高效的内存管理会更快。
我正在尝试将RDD转换为数据帧,但失败并出现错误: org.apache.spark.SparkException:由于阶段失败而中止作业:阶段2.0中的任务0失败4次,最近一次失败:阶段2.0中丢失任务0.3(TID 11,10.139.64.5,执行器0) 这是我的代码:
我尝试使用以下代码获取数据帧的分区数量: 按照我的理解,dataframe通过元数据给rdd增加了一个结构层。那么,为什么在转换成rdd时要花这么多时间呢?
我正在尝试将RDD[String]转换为数据框。字符串是逗号分隔的,所以我希望逗号之间的每个值都有一列。为此,我尝试了以下步骤: 但我明白了: 这不是这篇文章的副本(如何将rdd对象转换为火花中的数据帧),因为我要求RDD[字符串]而不是RDD[行]。 而且它也不是火花加载CSV文件作为DataFrame的副本?因为这个问题不是关于将CSV文件读取为DataFrame。
我有一个如下的CSV文件。 我想把这个转化成下面。 基本上,我想在输出数据帧中创建一个名为idx的新列,该列将填充与键=idx,value=“n”后面的行相同的值“n”。
RDD是以数组[数组[字符串]的格式创建的,具有以下值: 我想用模式创建一个数据帧: 接下来的步骤: 给出以下错误:
我有地图的RDD,我想把它转换成数据帧,这里是RDD的输入格式 有没有办法转换成数据帧像 df.show