2017-08-30 1 views
-1

Erstellung von name_tab:ngrams ohne Worte Aufträge in Hive

CREATE TABLE name_tab (country string, 
new_item ARRAY<STRUCT<ngram:array<string>, 
estfrequency:double>>); 

Insert-Anweisung:

INSERT OVERWRITE TABLE name_tab 
SELECT country, ngrams(sentences(var2),3,100) as word_map 
FROM bdd 
GROUP BY country; 

Erstellung von name_tab_new:

CREATE TABLE name_tab_new (country string, ngram1 string, ngram2 string, ngram3 string, estfrequency double); 

Anweisung Insert:

INSERT OVERWRITE TABLE name_tab_new 
SELECT country , X.ngram[0], X.ngram[1], X.ngram[2], X.estfrequency 
FROM name_tab 
LATERAL VIEW explode(new_item) Z as X; 

Diese Anfragen in Hive arbeiten. Es erstellt Ngrams nach Land. Das Problem: Für ein Land gibt es einen Unterschied zwischen diesem Ngram {aa, bb, cc} und diesem Ngram {bb, aa, cc}.

Ich möchte eine Lösung, die die Wörter Bestellungen nicht wichtig ist. Für ein Land möchte ich keinen Unterschied zwischen {aa, bb, cc} und {bb, aa, cc}. Ich will nur einen von ihnen.

Vielen Dank

Ergebnisse Beispiel:

* England, Brot, Sandwich, Saft, 120

England, Schreibtisch, Stuhl, Werkzeug, 54

England, Sandwich, Brot, Saft, 32

Italien, Meer, Roma, Coliseo, 47 *

Eigentlich möchte ich, dass:

* England, Brot, Sandwich, Saft, 152

England, Schreibtisch, Stuhl, Werkzeug, 54

Italien, Meer, Roma, Coliseo, 47 *

Ich hoffe, es gibt eine Option in der Ngrams-Funktion für die Nichtberücksichtigung der Reihenfolge.

In der Tabelle bdd ist die Variable "var2" eine Liste mehrerer Wörter, die durch ein Leerzeichen getrennt sind.

In der Tabelle name_tab haben wir:

Erste Zeile England, { "ngram": [ "Brot", "Sandwich", "Saft"], "estfrequency": 120,0}, { "ngram": ["Schreibtisch", "Stuhl", "Werkzeug"], "estfrequency": 54.0}, {"ngram": ["Sandwich", "Brot", "Saft"], "estfrequency": 32.0}

Zweite Linie Italien, { "ngram": [ "Meer", "Roma", "Coliseo"], "estfrequency": 47.0}

+0

Ihre Frage nicht klar ist, liefern eine Datenprobe einschließlich der erforderlichen Ergebnisse. –

+0

Ich hatte ein Beispiel. Danke – Camel

+0

Ich sehe nicht, wie dieses Beispiel diesen Pfosten bezieht –

Antwort

0

Demo

with t as (select 'a b a c c a b b a a a a c c b c a b c a b' as mycol) 

select  sort_array(e.ngram) as ngram 
      ,sum(e.estfrequency) as estfrequency 

from  (select explode(ngrams(sentences(mycol),2,1000)) e 

      from t 
      ) t 

group by sort_array(e.ngram) 
; 

+-----------+--------------+ 
| ngram | estfrequency | 
+-----------+--------------+ 
| ["a","a"] | 3.0   | 
| ["a","b"] | 6.0   | 
| ["a","c"] | 5.0   | 
| ["b","b"] | 1.0   | 
| ["b","c"] | 3.0   | 
| ["c","c"] | 2.0   | 
+-----------+--------------+ 
+0

Dudu hinzu. Wo ich das variable Land ansetze. Es funktioniert nicht, wenn ich es in die Gruppe von – Camel

+0

'Mycol' ist das Äquivalent zu 'var2' –

+0

Natürlich. Aber ich möchte nach der Variable "country" gruppieren – Camel

Verwandte Themen