Spark自连接优化

时间:2019-05-20 18:46:11

标签: apache-spark

假设我有一个usersuser_id | name | etc和一些用户数据user_attributes

对于代码组织,我想向user_id | zip_code | etc.添加一个attributes列。 users df可以来自attributes,也可以来自user_attributes表本身。

users

结果

import org.apache.spark.sql.Row
import org.apache.spark.sql.types._

val data = Seq(
  Row(1, "Tim"),
  Row(2, "Jerry"),
  Row(3, "Stacy")
)
val schema = List(
  StructField("id", IntegerType, true),
  StructField("first_name", StringType, true)
)
val usersDf = spark.createDataFrame(
  spark.sparkContext.parallelize(someData),
  StructType(someSchema)
)

def addAttribute(table: DataFrame, attribute: DataFrame): DataFrame = {
    table.join(attribute, "id")
}

val users = usersDf.select("id")
val attribute = usersDf.select("id", "first_name")
addAttribute(users, attribute).explain

在这种情况下,== Physical Plan == *(5) Project [id#52, first_name#60] +- *(5) SortMergeJoin [id#52], [id#59], Inner :- *(2) Sort [id#52 ASC NULLS FIRST], false, 0 : +- Exchange hashpartitioning(id#52, 200) : +- *(1) Project [id#52] : +- *(1) Filter isnotnull(id#52) : +- Scan ExistingRDD[id#52,first_name#53] +- *(4) Sort [id#59 ASC NULLS FIRST], false, 0 +- Exchange hashpartitioning(id#59, 200) +- *(3) Filter isnotnull(id#59) +- Scan ExistingRDD[id#59,first_name#60] 也是从attributes表派生的,它将扫描users两次并进行联接,而不是进行优化以仅扫描{{1} },并包含所有必要的列。

是否有一种方法可以告诉spark进行此优化(如果存在自连接,则扫描而不是连接)?

0 个答案:

没有答案