哪个是高效的,Dataframe 或 RDD 或 hiveql?

Posted

技术标签:

【中文标题】哪个是高效的,Dataframe 或 RDD 或 hiveql?【英文标题】:Which is efficient, Dataframe or RDD or hiveql? 【发布时间】:2015-07-16 11:49:01 【问题描述】:

我是 Apache Spark 的新手。

我的工作是读取两个 CSV 文件,从中选择一些特定的列,将其合并、聚合并将结果写入单个 CSV 文件。

例如,

CSV1

name,age,deparment_id

CSV2

department_id,deparment_name,location

我想获得第三个 CSV 文件

name,age,deparment_name

我将两个 CSV 都加载到数据帧中。 然后能够使用数据帧中存在的几种方法join,select,filter,drop 获得第三个数据帧

我也可以使用多个RDD.map() 来做同样的事情

我也可以使用hiveql 执行HiveContext 来做同样的事情

如果我的 CSV 文件很大,我想知道哪种方法最有效,为什么?

【问题讨论】:

【参考方案1】:

此博客包含基准测试。 Dataframes 比 RDD 高效得多

https://databricks.com/blog/2015/02/17/introducing-dataframes-in-spark-for-large-scale-data-science.html

这是来自博客的 sn-p

在高层次上,有两种优化。首先,Catalyst 应用逻辑优化,例如谓词下推。优化器可以将过滤谓词下推到数据源中,使物理执行能够跳过不相关的数据。对于 Parquet 文件,可以跳过整个块,并且可以通过字典编码将字符串比较转换为更便宜的整数比较。在关系数据库的情况下,谓词被下推到外部数据库中以减少数据流量。 其次,Catalyst 将操作编译成物理计划以供执行,并为那些通常比手写代码更优化的计划生成 JVM 字节码。例如,它可以在广播连接和随机连接之间进行智能选择,以减少网络流量。它还可以执行较低级别的优化,例如消除昂贵的对象分配和减少虚拟函数调用。因此,我们预计现有 Spark 程序在迁移到 DataFrame 时的性能会有所提高。

这是性能基准https://databricks.com/wp-content/uploads/2015/02/Screen-Shot-2015-02-16-at-9.46.39-AM.png

【讨论】:

【参考方案2】:

DataFrames 和 spark sql 查询都使用催化剂引擎进行了优化,所以我猜它们会产生相似的性能 (假设您使用的版本 >= 1.3)

两者都应该比简单的RDD操作更好,因为对于RDD,spark对你的数据类型没有任何了解,所以它不能做任何特殊的优化

【讨论】:

【参考方案3】:

Spark 的总体方向是使用数据帧,以便通过催化剂优化查询

【讨论】:

以上是关于哪个是高效的,Dataframe 或 RDD 或 hiveql?的主要内容,如果未能解决你的问题,请参考以下文章

如何将二进制文件更改为 RDD 或 Dataframe?

Pyspark 将 RowMatrix 转换为 DataFrame 或 RDD

如何在不收集的情况下将 RDD、Dataframe 或 Dataset 直接转换为广播变量?

火花,在DataFrame(或RDD)上多次应用过滤器,而没有多余的评估

在所有 spark executors 和 Driver 上执行脚本或小函数,而不使用 DataFrame 或 RDD

使用 groupby 或 aggregate 合并 RDD 或 DataFrame 中每个事务中的项目以进行 FP-growth