2016-08-30 1 views
0

das unten stehende Tabelle ImagineHive SQL: Wie einzigartig Saiten zu zählen, indem preffix

text 
---- 
h 
he 
hel  // All above are prefixes 
helll123 // hel is a prefix of helll123; this is the first occurence of helll123 
helll123 // second helll123 
f 
fa 
fals 
falst0 // fals is a prefix of falst0 

Unten Abfrage ist Pseudo-Code zu zeigen, was ich bin nach

SELECT 
unique_by_prefix(text) AS unique_text, // pseudo code 
count(*) 
FROM 
my_table 
GROUP BY 1 

das unten stehende Ergebnis erzeugen Sollte

unique_text count 
helll123  2 
falst0   1 

Grundsätzlich ignorieren wir Präfixe und zählen nur eindeutige Texte.

+1

wie kann man sagen, welche ein Präfix ist und über das ein Wort? Es sollte eine Regel geben. –

+0

Ich versuche eigentlich nicht zu unterscheiden, ob es ein Wort ist. Ich werde die Frage aktualisieren. Ich werde alles ignorieren, was ein Präfix oder etwas anderes ist – samol

Antwort

0

Windowing-Funktion https://cwiki.apache.org/confluence/display/Hive/LanguageManual+WindowingAndAnalytics

select text, 
    lead(text) over (order by text) as next_text, 
    lag(text) over (order by text) as pre_text 
from my_table; 

das Ergebnis wird sein:

text next_text pre_text 
h  he  NULL 
he  hel  h 
hel helll123 he 
helll123 helll123 hel 
helll123 f helll123 
f  NULL helll123 

dann können Sie mit diesen Werten vergleichen: wenn next_text mit Text zu beginnen, diese Platte ist nicht derjenige du willst, sonst hol dir diese Platte.

case when instr(next_text, text) = 1 then null else text as text_u_want 

dann null entfernen und my_table beitreten, können Sie Text zählen bekommen

+0

Erstaunlich! Lass es mich versuchen – samol

0

Ich glaube nicht, dass Sie dies in Hive mit einer Abfrage tun können.

Hier ist eine Möglichkeit:

select text, count(*) 
from t 
where not exists (select 1 
        from t t2 
        where t2.text <> t.text and t2.text like t1.text || '%' 
       ) 
group by text; 

Obwohl dies die Logik fängt, ich vermute, dass Hive eine Gleichheit für die Korrelationsklausel will.

0

Hier ist eine Möglichkeit, es zu tun.

  select distinct text into my_table1 from my_table 
      alter table my_table1 add sno int identity 

      create table my_table2 (text varchar(max), counter int) 

      declare @i int = 0 
      While (@i < (select COUNT(*) from my_table1)) 
      Begin 
      set @i = @i + 1 
      declare @text varchar(max) = (select text FROM my_table1 where sno = @i) 
      insert into my_table2 values(
      (select text from my_table1 where sno = @i), 
      (select COUNT(*) from my_table1 where text like @text + '%')) 
      End 

      select A.text, count(*) from my_table A left join my_table2 B on A.text = B.text where B.counter = 1 group by A.text