假设我有一个users
表user_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进行此优化(如果存在自连接,则扫描而不是连接)?