当前位置: 首页 > 面试题库 >

使用Impala按范围联接表的有效方法

冀啸
2023-03-14
问题内容

我有下表,第一个(Range)包括值范围和其他列:

row  | From   |  To     | Country ....
-----|--------|---------|---------
1    | 1200   |   1500  |
2    | 2200   |   2700  |
3    | 1700   |   1900  |
4    | 2100   |   2150  |
...

FromTobigint和是互斥的。该Range表包括180万条记录。附加表(Values)包含270万条记录,如下所示:

 row     | Value  | More columns....
 --------|--------|----------------
    1    | 1777   |    
    2    | 2122   |    
    3    | 1832   |    
    4    | 1340   |    
    ...

我想创建一个表,如下所示:

row      | Value  | From   | To    | More columns....
 --------|--------|--------|-------|---
    1    | 1777   | 1700   | 1900  |
    2    | 2122   | 2100   | 2150  |   
    3    | 1832   | 1700   | 1900  |   
    4    | 1340   | 1200   | 1500  |   
    ...

我用于BETWEEN上述任务,但查询永无止境:

VALUES.VALUE between RANGE.FROM and RANGE.TO

我需要在表分区或Impala中进行更改吗?


问题答案:

以下解决方案的主要思想是用等式联接替换theta联接(非等式联接),这将导致良好的分布+高效的局部联接算法。

范围(无穷大,无穷大)被分割为一部分n长度。
范围表中的每个范围都与其相交的部分相关联。

例如,给定n =
1000,范围[1652,3701]将与section关联[1000,2000)[2000,3000)并且[3000,4000)(并且将具有3条记录,每个section
1条)

               1652              3701
               |                 |
               -------------------

-------------------------------------------------------
|        |        |        |        |        |                
0        1000     2000     3000     4000     5000

以相同的方式,将值表中的值与包含该值的范围相关联,例如,2093将与range关联[2000,3000)

2个表之间的联接将在表示该节的值上进行,例如[1652,3701]2093并且将在该节上进行联接[2000,3000)

create table val_range (id int,from_val bigint,to_val bigint);

insert into val_range values
    (1,1200,1500)
   ,(2,2200,2700)
   ,(3,1700,1900)
   ,(4,2100,2150)
;

create table val (id int,val bigint);

insert into val values
    (1,1777)    
   ,(2,2122)    
   ,(3,1832)    
   ,(4,1340)
;
set n=1000;

select      v.id
           ,v.val
           ,r.from_val
           ,r.to_val

from       (select  r.*
                   ,floor(from_val/${hiveconf:n}) + pe.i    as match_val

            from    val_range r
                    lateral view    posexplode
                                    (
                                        split
                                        (
                                            space
                                            (
                                                cast
                                                (
                                                    floor(to_val/${hiveconf:n}) 
                                                  - floor(from_val/${hiveconf:n})

                                                    as int
                                                )
                                            )
                                           ,' '
                                        )
                                    ) pe as i,x
            ) r

            join    val v

            on      floor(v.val/${hiveconf:n})    =
                    r.match_val

where       v.val between r.from_val and r.to_val

order by    v.id        
;
+------+-------+------------+----------+
| v.id | v.val | r.from_val | r.to_val |
+------+-------+------------+----------+
|    1 |  1777 |       1700 |     1900 |
|    2 |  2122 |       2100 |     2150 |
|    3 |  1832 |       1700 |     1900 |
|    4 |  1340 |       1200 |     1500 |
+------+-------+------------+----------+


 类似资料:
  • 我正在与一个带有日期范围的雪花数据库左联接查询作斗争。请在下面找到样表内容 我的雪花SQL查询:选择o.ORDER_DATE,大小写当ORDER_DATE为NULL时,则“no”否则“yes”结束为ORDER_PLACED,C.customer_id,C.name FROM CUSTOMER C左联接C.customer_id=o.customer_id和o.ORDER_DATE>=DATEADD

  • 问题内容: 目前,我正在尝试实现OSGI版本范围(针对另一个主题,但是我喜欢它们定义版本范围的方式)。但是,我很难在OSGI中找到版本范围的特定定义。 不幸的是,OSGI API确实包含Version类,但不包含VersionRange类。似乎所有OSGI容器都提出了自己的(某种程度上无法找到)版本范围定义的解释。 因此,我有几个问题: 如果使用,此映射是否会映射到Version> = 1.4.0

  • 问题内容: 假设有一个与此问题类似的情况。我想得到以下结果: 我可以使用选定的答案作为解决方案: 我如何确保即使在该范围内没有任何结果,也将显示30-39的分数范围? 问题答案: 尝试以下查询(也在SQL Fiddle上): 编辑: 您可以通过将参数更改为轻松调整范围。可以使用以下构造来确保始终覆盖您的分数: 对于CTE。

  • 本文向大家介绍Elm按范围创建列表,包括了Elm按范围创建列表的使用技巧和注意事项,需要的朋友参考一下 示例 0.18.0 在0.18.0之前,您可以创建如下范围: 0.18.0 在0.18.0中,[1..5]语法已删除。 用此语法创建的范围始终是包含范围的,并且步长始终是1。

  • 问题内容: 我有一个n维数组,如下所示: 在此数组中,元素表示低值和高值。例如:指 我需要使用上面给出的范围生成所有值的组合。例如我想要 我已经尝试了以下方法来获得想要的东西: 笛卡尔函数取自使用numpy来构建两个数组的所有组合的数组 我需要做 几百万遍 。 我的问题:是否有 更好/有效的 方法来做到这一点? 问题答案: 我认为您正在寻找的是。不幸的是,这会以与所需格式不同的格式返回数组,因此您

  • 问题内容: 我有两个表,我们称它们为表A和B:- 表A看起来像这样: 表2(B)看起来像这样: 我需要一个像这样的表作为输出-它应该基本上包含表A的所有行+表B的状态 另外,最好通过简单的SQL语句,而不是过程。 提前致谢。如有任何澄清,请发表评论 因杜鲁 更新 当表B中的两行状态更改但在同一日期时,联接中的值不一致。 举个例子: 我有两个表,分别是A和B。它们是非常大的表,并且它们记录某些信息。