2016-12-06 6 views
0

Мы шесть улой таблицы с образцом (например) структура, как (где каждая таблица имеет миллионы торговых записей)Hive Объединение нескольких таблиц для создания горизонтальной компоновки

Table1 
MerchntId ,field1, field2 

Table2 
MerchantId, field3,field4 

Table3 
MerchantId, field5,field6,field7 

Table4 
MerchantId, field8,field9,field10 

Table5 
MerchantId, field11, field12, field13 

и так далее

Требование состоит в том, чтобы создать горизонтальный макет, чтобы принимать всех уникальных торговцев, где по крайней мере одно поле имеет значение для продавца. . Торговец может иметь или не присутствовать в других таблицах. (Для торговца могут быть записи в других таблицах или могут не быть есть)

Финальный стол MerchntId, поле1, поле2, field3, Field4,
Field5, field6, field7, field8, field9, field10, field11, field12, field13

выход должен быть как после присоединения

i) 101 abc def       ghi 
ii) 102 ghj fert hyu ioj khhh jjh ddd aas fff kkk fff vvv ff 

для случая (I) только три поля имеют значения для случая (б) все поля имеют значения

Для этого мы делаем FULL OUTER JOIN на merchantId для двух таблиц и так далее, а затем создать финальный стол

Есть ли лучший подход делает это?

например. мой нынешний подход

SELECT distinct 
(case when a.MerchntId IS NOT NULL then a.MerchntId else (case when  
b.MerchntId IS NOT NULL 
then b.MerchntId else '' end) end) as MerchntId, 
(case when a.field1 IS NOT NULL then a.field1 else '' end) as field1, 
(case when a.field2 IS NOT NULL then a.field2 else '' end) as field2, 
(case when b.field3 IS NOT NULL then b.field3 else '' end) as field3, 
(case when b.field4 IS NOT NULL then b.field4 else '' end) as field4 
from Table1 a 
full outer join Table2 b 
ON a.MerchntId = c.MerchntId; 

полное внешнее соединение таблицы 3 и таблицы 4 , а затем полное внешнее объединение этих двух таблиц для создания финального стола

ответ

0

Я не вижу какой-либо другой вариант, так как ваши требования явно перевести на полное внешнее соединение. Тем не менее, ваш запрос может быть улучшена за счет использования COALESCE and NVL:

SELECT 
COALESCE(a.MerchntId, b.MerchntId) as MerchntId, 
NVL(a.field1, '') as field1, 
NVL(a.field2, '') as field2, 
NVL(b.field3, '') as field3, 
NVL(b.field4, '') as field4 
from Table1 a 
full outer join Table2 b 
ON a.MerchntId = c.MerchntId; 

Кроме того, я не уверен, почему вы используете distinct в запросе.

0

Включите все 6 таблицы, заменив пропущенные поля нулями. Тогда Совокупные по MerchantId с использованием мин или макс:

select MerchantId, max(field1) field1, max(field2) field2...max(field13) field13 from 
(
select MerchntId field1, field2, null field3, null field4... null field13 from Table1 
union all 
select MerchntId null field1, null field2, field3, field4... null field13 from Table2 
union all 
... 

select MerchantId, null field1, null field2... field11, field12, field13 
from table6 
)s group by MerchantId 

После этого вы можете применить логику с заменой аннулирует с «» при необходимости