Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark 如何将数据集与其他值之间的值连接起来?_Apache Spark_Apache Spark Sql - Fatal编程技术网

Apache spark 如何将数据集与其他值之间的值连接起来?

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视图

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查询优化中学到了什么?