在火花中有效地使用联合

Posted

技术标签:

【中文标题】在火花中有效地使用联合【英文标题】:efficiently using union in spark 【发布时间】:2017-04-22 02:33:22 【问题描述】:

我是 scala 和 spark 的新手,现在我有两个 RDD,比如 A 是 [(1,2),(2,3)],B 是 [(4,5),(5,6)],我想要得到像 [(1,2),(2,3),(4,5),(5,6)] 这样的 RDD。但事情是我的数据很大,假设 A 和 B 都是 10GB。我使用 sc.union(A,B) 但它很慢。我在spark UI中看到这个阶段有28308个任务。

有没有更有效的方法来做到这一点?

【问题讨论】:

【参考方案1】:

为什么不将这两个RDDs 转换为dataframes 并使用union 函数。 转换为dataframe 很容易,您只需要将import sqlContext.implicits._.toDF() 函数与header names 一起应用。 例如:

    val sparkSession = SparkSession.builder().appName("testings").master("local").config("", "").getOrCreate()

    val sqlContext = sparkSession.sqlContext

    var firstTableColumns = Seq("col1", "col2")
    var secondTableColumns = Seq("col3", "col4")

    import sqlContext.implicits._

    var firstDF = Seq((1, 2), (2, 3), (3, 4), (2, 3), (3, 4)).toDF(firstTableColumns:_*)

    var secondDF = Seq((4, 5), (5, 6), (6, 7), (4, 5)) .toDF(secondTableColumns: _*)

    firstDF = firstDF.union(secondDF)

使用dataframes 应该比使用RDDs 更容易。将dataframe 更改为RDD 也很简单,只需调用.rdd 函数

val rddData = firstDF.rdd

【讨论】:

以上是关于在火花中有效地使用联合的主要内容,如果未能解决你的问题,请参考以下文章

火花联合不按预期工作,添加新行

自动驾驶+物流,会产生怎样的火花?

Laravel 使用预先加载和联合查询

在 SQL Azure 联合上生成序列号的有效方法

如何使这个联合查询更有效率?

为啥 Linq-to-sql 错误地删除了我的联合中的字段?