Hive 中的统计和数据挖掘

此页面是集成到 Hive 中的高级统计和数据挖掘功能的辅助文档,尤其是那些功能不只一行描述的功能。

ngrams()和 context_ngrams():N-gram 频率估算

N-grams是从较长序列中提取的长度为 N 的子序列。 ngrams() UDAF 的目的是从一个或多个序列中找到k最频繁的 n-元。它可以与sentences() UDF 一起使用以分析非结构化自然语言文本,或与collect()函数一起使用以分析更通用的字符串数据。

上下文 n-gram 与 n-gram 相似,但是允许您指定一个“上下文”字符串,围绕该字符串估计 n-gram。例如,您可以指定只对在上下文中“我爱”之后的文本中最常见的两个单词短语感兴趣。您可以通过手动剥离非上下文内容的句子,然后将其传递给ngrams()来获得相同的结果,但是context_ngrams()使其变得更加容易。

Use Cases

  • (ngram)结合停用词列表在文本中查找重要主题。
    1. (ngrams)在文本中查找趋势主题。
    2. (context_ngrams)围绕某些单词(例如“ Twitter 是”)提取营销情报。
    3. (ngram)查找经常访问的 URL 序列。
    4. (context_ngrams)查找以特定 URL 开头或结尾的经常访问的 URL 序列。
    5. (context_ngrams)预计算常见搜索提前量。

Usage

SELECT context_ngrams(sentences(lower(tweet)), 2, 100 [, 1000]) FROM twitter;

上面的命令将从一个名为twitter的假设表中返回前 100 个双字母组(2 克)。假定tweet列包含具有任意(可能无意义)文本的字符串。 lower() UDF 首先将文本转换为小写以进行标准化,然后sentences()将文本拆分为单词数组。可选的第四个参数是“精度因子”,它控制存储器使用率和频率估计精度之间的折衷。较高的值将更准确,但可能会因 OutOfMemory 错误而使 JVM 崩溃。如果省略,则使用明智的默认值。

SELECT context_ngrams(sentences(lower(tweet)), array("i","love",null), 100, [, 1000]) FROM twitter;

上面的命令将返回 Twitter 推文假设数据库中短语“ i love”之后的前 100 个单词的列表。每个null指定要估计的 n 元语法元素的位置;因此,每个查询在上下文数组中必须至少包含null

请注意,以下两个查询是相同的,但实际上ngrams()会稍快一些。

SELECT ngrams(sentences(lower(tweet)), 2, 100 [, 1000]) FROM twitter;
SELECT context_ngrams(sentences(lower(tweet)), array(null,null), 100, [, 1000]) FROM twitter;

Example

SELECT explode(ngrams(sentences(lower(val)), 2, 10)) AS x FROM kafka;
{"ngram":[of","the],"estfrequency":23.0}
{"ngram":[on","the],"estfrequency":20.0}
{"ngram":[in","the],"estfrequency":18.0}
{"ngram":[he","was],"estfrequency":17.0}
{"ngram":[at","the],"estfrequency":17.0}
{"ngram":[that","he],"estfrequency":16.0}
{"ngram":[to","the],"estfrequency":16.0}
{"ngram":[out","of],"estfrequency":16.0}
{"ngram":[he","had],"estfrequency":16.0}
{"ngram":[it","was],"estfrequency":15.0}
SELECT explode(context_ngrams(sentences(lower(val)), array("he", null), 10)) AS x FROM kafka;
{"ngram":[was],"estfrequency":17.0}
{"ngram":[had],"estfrequency":16.0}
{"ngram":[thought],"estfrequency":13.0}
{"ngram":[could],"estfrequency":9.0}
{"ngram":[would],"estfrequency":7.0}
{"ngram":[lay],"estfrequency":5.0}
{"ngram":[s],"estfrequency":4.0}
{"ngram":[wanted],"estfrequency":4.0}
{"ngram":[did],"estfrequency":4.0}
{"ngram":[felt],"estfrequency":4.0}

histogram_numeric():估算频率分布

直方图表示来自经验数据的频率分布。此处指的是具有可变大小的 bin 的直方图。具体而言,此 UDAF 将返回代表直方图 bin 中心和高度的(x,y)对的列表。然后由您决定在 Excel/Gnuplot/Matlab/Mathematica 中绘制它们以获得漂亮的图形显示。

Use Cases

  • 估计可能由其他属性分组的列的频率分布。
    2.在连续值列中选择离散点。

Usage

SELECT histogram_numeric(age) FROM users GROUP BY gender;

上面的命令是不言自明的。将输出转换为图形显示会涉及更多的工作。假设您已将histogram()的输出解析为(x,y)对的文本文件data.txt,则下面的Gnuplot命令应该执行此操作。

plot 'data.txt' u 1:2 w impulses lw 5

Example

SELECT explode(histogram_numeric(val, 10)) AS x FROM normal;
{"x":-3.6505464999999995,"y":20.0}
{"x":-2.7514727901960785,"y":510.0}
{"x":-1.7956678951954481,"y":8263.0}
{"x":-0.9878507685761995,"y":19167.0}
{"x":-0.2625338380837097,"y":31737.0}
{"x":0.5057392319427763,"y":31502.0}
{"x":1.2774146480311135,"y":14526.0}
{"x":2.083955560712489,"y":3986.0}
{"x":2.9209550254545484,"y":275.0}
{"x":3.674835214285715,"y":14.0}