Hive for bag of words(字典中每个单词的字数)
Posted
技术标签:
【中文标题】Hive for bag of words(字典中每个单词的字数)【英文标题】:Hive for bag of words (word count for each word in the dictionary) 【发布时间】:2016-03-06 11:21:46 【问题描述】:我有一个这样结构的表:
user_id | message_id | content
1 | 1 | "I like cats"
1 | 1 | "I like dogs"
以及dictionary.txt
(或外部 hive 表)中的有效单词列表,例如:
I,like,dogs,cats,lemurs
我的目标是为每个用户生成一个字数统计表
user_id | "I" | "like" | "dogs" | "cats" | "lemurs"
1 | 2 | 2 | 1 | 1 | 0
这是我迄今为止尝试过的:
SELECT user_id, word, COUNT(*)
FROM messages LATERAL VIEW explode(split(content, ' ')) lTable as word
GROUP BY user_id,word;
【问题讨论】:
为什么投票失败?一个解释会更有帮助 您的查询有什么问题? 如何合并预定义的字典文件并生成具有恒定长度的行(不取决于唯一词的数量) 【参考方案1】:检查一下:
select ename,
length(ename)-length(replace(ename,'A', '')) A,
length(ename)-length(replace(ename,'W', '')) W
FROM EMP;
否则,您可以定义一个变量(您的搜索字符串)并将其放置在“A”、“W”等位置
【讨论】:
这个技巧计算被替换的字符数量,而不是替换的数量【参考方案2】:我对在 Hive 上做 Pivot 不是很熟悉,但在 pig 中可以做到。
DEFINE GET_WORDCOUNTS com.***.pig.GetWordCounts('$dictionary_path');
A = LOAD .... AS user_id, message_id, content;
C = GROUP B BY (user_id);
D = FOREACH C GENERATE group, FLATTEN(GET_WORDCOUNTS(B.content));
您将必须编写一个简单的 UDF GetWordCounts
来标记每个分组记录的输入内容,并检查输入字典。
【讨论】:
以上是关于Hive for bag of words(字典中每个单词的字数)的主要内容,如果未能解决你的问题,请参考以下文章
视觉SLAM之词袋(bag of words) 模型与K-means聚类算法浅析
kaggle实战之 bag of words meet bag of poopcorn