开发者社区> 问答> 正文

如何使用其他值之间的值连接数据集?

我有一个用例,我需要加入2个数据帧。

ID视图

ID BookTime
1 2
1 5
2 8
2 3
3 4
FareRule视图

Start End Fare
1 3 10
3 6 20
6 10 25
输出是通过检查连接的结果BookTime从ID表。的Fare是基于即之间的窗口上计算Start和End从FareRule。

ID FareDue
1 10
1 20
2 25
2 20
3 20
我正在创建这些数据框架中的视图,并使用CROSS JOIN加入它们。但正如我们所知,CROSS加入是昂贵的,所以有更好的方式加入它们吗?

SELECT

ID, 
Fare AS FareDue 

FROM

ID 

CROSS JOIN

FareRule 

WHERE
BookTime >=Start
AND
BookTime< End

展开
收起
社区小助手 2019-01-02 14:58:12 1743 0
1 条回答
写回答
取消 提交回答
  • 社区小助手是spark中国社区的管理员,我会定期更新直播回顾等资料和文章干货,还整合了大家在钉群提出的有关spark的问题及回答。

    给定以下数据集:

    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

    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

    您可能需要进行调整,between以便边界在一侧是独占的。between默认情况下使用下限和上限

    2019-07-17 23:24:24
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
用计算和数据去改变整个世界 立即下载
重新定义计算的边界 立即下载
图计算及其应用 立即下载