Como posso obter algo além de NULL/0/1 de if(…,1,0)?
Pergunta
Eu tenho o seguinte código que produz valores inexplicáveis:
select keyword,
count(distinct foo) as foos,
count(distinct bar) as bars,
count(*) as events,
length(keyword) as kwd_len,
if(keyword rlike '[A-Z]', 1, 0) as has_uc,
if(keyword rlike '[a-z]', 1, 0) as has_lc,
if(keyword rlike '[\\W ]', 1, 0) as has_nw
from all_my_data
group by keyword
where has_uc > 1 or has_lc > 1 or has_nw > 1;
A impressão (redirecionada para um arquivo) fica assim:
keyword foos bars events kwd_len has_uc has_lc has_nw
O Exterminador do Futuro - A S�rie Machinima� NULL NULL 1 1 14 81 1
NULL 1 1 3 21 0 1
credit offers NULL 1 1 1 77 0 1
muzikály NULL 1 3 3 9 0 1
NULL NULL 1 1 1 20 1
show NULL 1 1 3 5 0 1
(brooks , NULL 1 1 1 31 0 1
opera NULL 1 1 1 6 0 1
��ͯ NULL 1 1 1 7 0 0
l NULL NULL 1 1 1 5 0
methyl- NULL 1 1 2 24 0 1
Apartamento Planta baja престиж NULL 1 1 1 32 1 1
festivaly NULL 1 1 1 10 0 1
fiAEBEECACACACACACACACACACACAAA NULL 1 1 1 64 1 1
,B NULL 1 1 1 3 1 0
O Exterminador do Futuro - A S�rie Machinima� NULL NULL 1 1 7 87 1
concerts NULL 1 1 1 9 0 1
tanec NULL 1 3 5 6 0 1
Weekend Waiting Staff / Team Member ?€“ Central London ? NULL 1 1 1 77 1 1
ìùuL NULL 1 1 2 37 1 1
O Exterminador do Futuro - A S�rie Machinima� NULL NULL NULL NULL 1 1 2
MZ� �� � @ NULL NULL 1 1 2 59 1
error http://www.‰¼ NULL 1 1 1 50 0 1
2@ NULL 1 2 2 11 1 0
smc NULL NULL 1 1 2 18 0
[■ ▶ ▮▮] ® Mike Candys feat. David Deen - People Hold On (500K Exclusive Rework) ★ EXCLUSIVE! for club5485048 ★ [track at NULL 1 1 2 141 1 1
NULL 1 2 2 9 0 0
acting on a decision to buy marijuana illegally falls under the NULL 1 1 1 165 0 1
O Exterminador do Futuro - A S�rie Machinima� NULL NULL NULL 1 1 1 99
X NULL 1 1 2 65 1 1
�͠ NULL 1 1 1 5 0 0
NULL NULL 1 1 1 31 0
da???? �? NULL NULL 1 1 2 75 1
koncerty NULL 1 2 4 9 0 1
�͍ NULL NULL 1 1 1 15 1
O Exterminador do Futuro - A S�rie Machinima� NULL NULL NULL NULL 1 1 4
awk '{printf " NULL 1 1 1 38 0 1
ΒETA: NULL 1 1 2 93 1 0
�m NULL NULL 1 1 1 8 0
lsɬLjLj- Yahoo NULL 1 1 2 16 1 1
brave frontier %H2'2 NULL 1 1 1 23 1 1
smc NULL NULL 1 1 2 18 0
O Exterminador do Futuro - A S�rie Machinima DVDRip Rm� NULL 1 1 14 72 1 1
O Exterminador do Futuro - A S�rie Machinima� NULL NULL NULL 1 1 2 91
$A. ?8G .> NULL NULL 1 1 1 30 1
�͠ NULL 1 1 1 5 0 0
NULL 1 1 4 2 0 1
sport NULL 1 2 3 6 0 1
http://www.‰¼ NULL 1 1 1 44 0 1
ŠUN NULL 1 1 2 4 1 0
NULL 1 2 2 28 0 0
činohra NULL 1 3 7 8 0 1
Motorcraft MERCON NULL 1 1 6 21 1 1
O Exterminador do Futuro - A S�rie Machinima DVDRip Rm� NULL 1 1 7 76 1 1
NULL 1 1 1 8 1 1
� NULL 1 1 2 45 0 1
juegos frip NULL 1 1 1 13 0 1
NULL 1 1 1 11 0 1
Minhas perguntas são:
- Onde estão os valores não-[01] para
has_uc
ehas_lc
vem de onde? - Por que eu repeti
keyword
campos (vazio,Exterminador do Futuro
&c, confirmado por exame direto de/misc/hdfs/user/hive/warehouse/bad_keywords/000000_0
) apesar degroup by keyword
? - Por que eu tenho
NULL
valores parabars
efoos
(como podecount
retornarNULL
)?
Solução
Não conheço o HiveQL, mas de uma perspectiva geral do SQL, parece que seu "grupo por palavra-chave" na primeira consulta está somando implicitamente todos os sinalizadores has_XX para cada palavra-chave, quando o que você deseja é apenas uma lista distinta de palavras-chave e suas propriedades.
Tente eliminar a cláusula "agrupar por palavra-chave" na primeira consulta e, em vez disso, faça:
create table t1 as
select distinct keyword,
length(keyword) as kwd_len,
if(keyword rlike '[A-Z]', 1, 0) as has_uc,
if(keyword rlike '[a-z]', 1, 0) as has_lc,
if(keyword rlike '[\\W ]', 1, 0) as has_nw
from all_my_data
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow