创建name_tab:
CREATE TABLE name_tab (country string,
new_item ARRAY<STRUCT<ngram:array<string>,
estfrequency:double>>);
插入声明:
INSERT OVERWRITE TABLE name_tab
SELECT country, ngrams(sentences(var2),3,100) as word_map
FROM bdd
GROUP BY country;
创建name_tab_new:
CREATE TABLE name_tab_new (country string, ngram1 string, ngram2 string, ngram3 string, estfrequency double);
插入声明:
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;
Hive中的这些请求工作。它按国家创建ngrams。
问题:对于一个国家,这个ngram {aa, bb, cc}
和这个ngram {bb, aa, cc}
之间存在差异。
我想要一个解决方案,订单这些词并不重要。对于一个国家/地区,我希望{aa, bb, cc}
和{bb, aa, cc}
之间不存在差异。我只想要其中一个。
非常感谢
结果示例:
*英格兰,面包,三明治,果汁,120
英格兰,桌子,椅子,工具,54
英格兰,三明治,面包,果汁,32
意大利,海,罗马,Coliseo,47 *
实际上,我希望如此:
*英格兰,面包,三明治,果汁,152
英格兰,桌子,椅子,工具,54
意大利,海,罗马,Coliseo,47 *
我希望ngrams功能中有一个选项可以不考虑订单。
在表bdd中,变量“var2”是由blanck分隔的几个单词的列表。
在表name_tab中,我们有:
第一行 英格兰,{“ngram”:[“面包”,“三明治”,“果汁”],“estfrequency”:120.0},{“ngram”:[“桌子”,“椅子”,“工具”],“estfrequency” :54.0},{“ngram”:[“三明治”,“面包”,“果汁”],“estfrequency”:32.0}
第二行 意大利,{“ngram”:[“sea”,“Roma”,“Coliseo”],“estfrequency”:47.0}
答案 0 :(得分:0)
<强>演示强>
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 |
+-----------+--------------+