apache-spark - RDD vs DataFrame(存储数据类型)
问题描述
我正在阅读一本关于 Apache Spark 的书,在比较 RDD 和 DataFrame 时,它有以下内容要说:
RDD 和 DataFrame 的主要区别在于 DataFrame 存储的数据信息比 RDD 多得多,例如数据类型和列名。这允许 DataFrame 比 Spark 转换和 Spark 操作在 RDD 上进行处理更有效地优化处理。
然而,在使用 Scala 玩 RDD 时,我注意到数据类型实际上是存储的。例如:
val acTuplesByAmount = acBalTuples.map{case (amount, accno) => (amount.toDouble, accno)}
acTuplesByAmount.collect()
res5: Array[(Double, String)] = Array((50000.0,SB10001), (12000.0,SB10002), (8500.0,SB10004), (5000.0,SB10005), (3000.0,SB10003))
如您所见,它记录了我们想要一个 Double 和一个 String 的事实。在我的地图之前,我认为它可能是两个字符串。
那么这本书有错吗?或者 DataFrames 是否仍然具有更好的数据类型?
解决方案
在 DataFrame 中,spark 只对数据进行洗牌,因为所有执行者都知道数据模式。在 RDD 中,它们是序列化的 java 对象,洗牌成本要高得多,并且再次携带有关数据的所有信息。
推荐阅读
- c - 在 C 中的 EOF 之后,while 循环仍然打印一次
- com - 我注册的 COM 对象不能作为 InProc 运行
- python - FileNotFoundError at /user/profile/edit [Errno 2] 没有这样的文件或目录:'user_3/profile.jpg'
- facebook - Dialogflow 后续意图不起作用?训练代理中的“操作”显示“不可用”。
- angular - Angular Reactive Form,动态创建表单控件
- r - 如何解决这个问题?错误:提供给连续刻度的离散值
- javascript - 霍夫曼编码中丢失的信息
- android - 主要活动中的导航控制器
- amazon-web-services - Use of redis cluster vs standalone redis
- javascript - 如何解析单击按钮的用户