Hive SQL Соедините поля ON с условно равной операцией, чтобы игнорировать NULL - PullRequest
0 голосов
/ 26 февраля 2020

У меня есть таблица A как

ID1 ID2 ID3 VALUE
1   A   xx  100
1   A   yy  200
1   A   yy  100
1   A       100
1   B   zz  300
2   B   yy  300
2   C   yy  400

В таблице B есть действия или правила, описанные ниже, и она может быть записана в более чем 3 поля идентификатора

ID1 ID2 ID3 ACTION
    A   xx  GetAxx
    A   yy  GetAyy
    B       GetB

Я хочу присоединиться к Таблицы и результат, как показано ниже

ID1 ID2 ID3 TOTAL
1   A   xx  100
1   A   yy  200
1   A   yy  100
1   B   zz  300
2   B   yy  300

Я пробовал простое условие ИЛИ, а также условные объединения, однако получил ту же ошибку СБОЙ: Декартовы продукты SemanticException отключены по соображениям безопасности. Если вы знаете, что делаете, пожалуйста, установите false для truehive.strict.checks.cartesian.product, а для hive.mapred.mode не задано значение 'strict'.

SELECT * FROM TABLE_A A
JOIN TABLE_B B
ON
(B.ID1 IS NULL OR A.ID1=B.ID1) AND
(B.ID2 IS NULL OR A.ID2=B.ID2) AND
(B.ID3 IS NULL OR A.ID3=B.ID3)

SELECT * FROM TABLE_A A
JOIN TABLE_B B
ON
(COALESCE(A.ID1,"NA")=COALESCE(B.ID1, A.ID1, "NA") and
(COALESCE(A.ID2,"NA")=COALESCE(B.ID2, A.ID2, "NA") and
(COALESCE(A.ID3,"NA")=COALESCE(B.ID3, A.ID3, "NA")

Что является правильным способом условно объединить несколько полей, игнорируя при этом нулевое сравнение из условия соединения или есть способ заставить условие приравнять значение true, если в таблице B имеется значение NULL или существует способ принудительно сопоставить значение NULL из таблицы B с любым значением в Таблица A для возврата true

Любая помощь очень ценится!

Ответы [ 2 ]

0 голосов
/ 26 февраля 2020

Вы можете использовать exists:

select a.*
from a
where exists (select 1
              from b
              where (b.id1 = a.id1 or b.id1 is null) and
                    (b.id2 = a.id2 or b.id2 is null) and
                    (b.id3 = a.id3 or b.id3 is null)
             );

Вы также можете сделать это, используя JOIN, но это может привести к дублированию строк при некоторых обстоятельствах:

select a.*
from a join
     b
    on (b.id1 = a.id1 or b.id1 is null) and
       (b.id2 = a.id2 or b.id2 is null) and
        (b.id3 = a.id3 or b.id3 is null);
0 голосов
/ 26 февраля 2020

Вы можете получить результат, непосредственно применив внутреннее соединение к столбцу ID2, ID3.

SELECT A.ID1,A.ID2,A.ID3,A.VALUE as total FROM TABLE_A A
JOIN TABLE_B B
ON
A.ID2=B.ID2 and
A.ID3=B.ID3
...