Apache spark 如何将数据集与其他值之间的值连接起来?
我有一个用例,需要连接两个数据帧 ID视图Apache spark 如何将数据集与其他值之间的值连接起来?,apache-spark,apache-spark-sql,Apache Spark,Apache Spark Sql,我有一个用例,需要连接两个数据帧 ID视图 ID BookTime 1 2 1 5 2 8 2 3 3 4 票价规则视图 Start End Fare 1 3 10 3 6 20 6 10 25 通过检查ID表中的BookTime,输出是join的结果。票价是根据票价规则中的开始和结束之间的窗口计算的 ID FareDue 1 10 1 20 2 25 2 20 3 20 我正在用这些数据帧创建一个视图,并使用交叉连接来连接
ID BookTime
1 2
1 5
2 8
2 3
3 4
票价规则视图
Start End Fare
1 3 10
3 6 20
6 10 25
通过检查ID
表中的BookTime
,输出是join的结果。票价
是根据票价规则
中的开始
和结束
之间的窗口计算的
ID FareDue
1 10
1 20
2 25
2 20
3 20
我正在用这些数据帧创建一个视图,并使用交叉连接来连接它们。但正如我们所知,交叉连接是昂贵的,所以有更好的方式加入他们吗
SELECT
ID,
Fare AS FareDue
FROM
ID
CROSS JOIN
FareRule
WHERE
BookTime >=Start
AND
BookTime< End
选择
身份证件
应付车费
从…起
身份证件
交叉连接
票价规则
哪里
BookTime>=开始
和
预订时间<结束
给定以下数据集:
val id = Seq((1, 2), (1, 5), (2, 8), (2, 3), (3, 4)).toDF("ID", "BookTime")
scala> id.show
+---+--------+
| ID|BookTime|
+---+--------+
| 1| 2|
| 1| 5|
| 2| 8|
| 2| 3|
| 3| 4|
+---+--------+
val fareRule = Seq((1,3,10), (3,6,20), (6,10,25)).toDF("start", "end", "fare")
scala> fareRule.show
+-----+---+----+
|start|end|fare|
+-----+---+----+
| 1| 3| 10|
| 3| 6| 20|
| 6| 10| 25|
+-----+---+----+
您只需使用between
表达式将它们连接在一起
val q = id.join(fareRule).where('BookTime between('start, 'end)).select('id, 'fare)
scala> q.show
+---+----+
| id|fare|
+---+----+
| 1| 10|
| 1| 20|
| 2| 25|
| 2| 10|
| 2| 20|
| 3| 20|
+---+----+
您可能需要在之间调整
,以便边界在一侧是独占的<默认情况下,code>between
使用下限和上限,包括下限和上限。可能重复使用交叉联接的原因?从外观上看,使用常规联接可以得到相同的结果。与其他SQL查询引擎一样,Spark也有一个查询优化器&WHERE和internal-join上的交叉联接(或逗号)没有区别。在任何地方阅读关系查询优化/实现的一般思想。(包括几十本在线免费出版的学术教科书,pdf格式)阅读优化器Catalyst&随时随地编写最佳Spark SQL查询。(许多编写了ACM论文“Spark SQL:Spark中的关系数据处理”的实现者都在Databricks工作。)PS在考虑提问之前,您从谷歌搜索re Spark SQL查询优化中学到了什么?