Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/38.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
Join 配置单元:在具有NULL的条件下使用2进行连接的最佳方式_Join_Hive_Left Join_Hiveql - Fatal编程技术网

Join 配置单元:在具有NULL的条件下使用2进行连接的最佳方式

Join 配置单元:在具有NULL的条件下使用2进行连接的最佳方式,join,hive,left-join,hiveql,Join,Hive,Left Join,Hiveql,我有两张表,如下所示 表A ID1 ID2 NAME 112 NULL ADAM 132 990 BRIAN NULL 980 CARL 表B ID1 ID2 SURNAME 112 NULL LEVINE 132 990 LARA NULL 980 JOHNSON 如果我像下面那样加入表,空比较将不起作用,因此不会返回ADAM的姓氏 SELECT A.NAME,B.SURNAME FROM TABLE_A A LEFT JOIN TABLE_B B ON A.ID1

我有两张表,如下所示

表A

ID1  ID2  NAME
112  NULL ADAM
132  990  BRIAN
NULL 980  CARL
表B

ID1  ID2  SURNAME
112  NULL LEVINE
132  990  LARA
NULL 980  JOHNSON
如果我像下面那样加入表,空比较将不起作用,因此不会返回ADAM的姓氏

SELECT A.NAME,B.SURNAME
FROM
TABLE_A A
LEFT JOIN
TABLE_B B
ON A.ID1 = B.ID1
AND
A.ID2 = B.ID2;
我在ID2的ON子句中添加了一个NULL检查,它确实起了作用,但即使对于较小的表,该操作的成本也很高。(见下文)


进行此比较的正确方法是什么?

要像正常值一样连接空值,请使用
NVL()
函数将
NULL
替换为数据中通常不使用的值,例如
-9999

SELECT A.NAME,B.SURNAME
FROM
TABLE_A A
LEFT JOIN
TABLE_B B
ON NVL(A.ID1,-9999) = NVL(B.ID1,-9999)
AND
NVL(A.ID2,-9999) = NVL(B.ID2,-9999);

要像普通值一样连接空值,请使用
NVL()
函数将
NULL
替换为数据中通常不使用的值,例如
-9999

SELECT A.NAME,B.SURNAME
FROM
TABLE_A A
LEFT JOIN
TABLE_B B
ON NVL(A.ID1,-9999) = NVL(B.ID1,-9999)
AND
NVL(A.ID2,-9999) = NVL(B.ID2,-9999);

配置单元不支持在条件下的或表达式。
联接条件应由
纯相等表达式组成

我更喜欢
合并
功能:

SELECT A.NAME,B.SURNAME
FROM
TABLE_A A
LEFT JOIN
TABLE_B B
ON 
 COALESCE(A.ID1, 'missing') = COALESCE(B.ID1, 'missing') 
AND
 COALESCE(A.ID2, 'missing') = COALESCE(B.ID2, 'missing')

配置单元不支持在条件下的或表达式。
联接条件应由
纯相等表达式组成

我更喜欢
合并
功能:

SELECT A.NAME,B.SURNAME
FROM
TABLE_A A
LEFT JOIN
TABLE_B B
ON 
 COALESCE(A.ID1, 'missing') = COALESCE(B.ID1, 'missing') 
AND
 COALESCE(A.ID2, 'missing') = COALESCE(B.ID2, 'missing')

这是一个典型的情况场景,需要空安全相等运算符,这是带有GenericUDF的配置单元本机支持的。正如我引述的,这个操作员:

Returns same result with EQUAL(=) operator for non-null operands, 
but returns TRUE if both are NULL, FALSE if one of the them is NULL.
因此,SQL非常简单,如下所示:

select 
    a.name,
    b.surname
from table_a a
left join table_b b
on a.id1 <=> b.id1 and a.id2 <=> b.id2;
选择
a、 名字,
b、 姓
从表a
左联接表
关于a.id1b.id1和a.id2b.id2;

这是一个典型的案例场景,需要空安全相等运算符,这是带有GenericUDF的Hive本机支持的。正如我引述的,这个操作员:

Returns same result with EQUAL(=) operator for non-null operands, 
but returns TRUE if both are NULL, FALSE if one of the them is NULL.
因此,SQL非常简单,如下所示:

select 
    a.name,
    b.surname
from table_a a
left join table_b b
on a.id1 <=> b.id1 and a.id2 <=> b.id2;
选择
a、 名字,
b、 姓
从表a
左联接表
关于a.id1b.id1和a.id2b.id2;

尝试使用
COALESCE
对ID字段更改
NULL
非空值:
对COALESCE(A.ID1,'u NULL')=COALESCE(B.ID1,'u NULL')和…
尝试使用
COALESCE
对ID字段更改
NULL
对非空值:
对COALESCE(A.ID1,'u NULL')=COALESCE(B.ID1,'u NULL'))和…