hadoop - 为什么 hive 中的 CTAS 查询没有按预期给出结果?
问题描述
在这种情况下,我创建了一个包含 100 行的配置单元表“test”。
当我启动 hive 终端并输入以下 SQL
select * from test tablesample(2 percent);
它返回 3 行数据;
但是当我添加“创建表作为选择”时,如下所示。
create table sample as select * from test tablesample(2 percent);
我发现“样本”表中有 100 行。
我不知道为什么。
非常感谢。
解决方案
文档说这将TABLESAMPLE (n PERCENT)
允许 Hive 获取至少 n% 的数据大小(注意它并不一定意味着行数)作为输入。如果我们无法对其进行采样,则 MapReduce 作业的输入将是整个表/分区。我们在 HDFS 块级别执行此操作,以便采样粒度为块大小。例如,如果块大小为 256MB,即使输入大小的 n% 仅为 100MB,您也会得到 256MB 的数据。
不幸的是,它不能保证每次都获取相同的块,总 row_count 可能会有所不同。
我建议增加百分比并添加limit n
以保证返回 n 行。或者干脆使用limit n
:
select * from test tablesample(5 percent) limit 100; --may perform faster
或者
select * from test limit 100;
Limit 当然比 tablesample 效率低,因为 limit 在 reducer 上起作用,也许 tablesample 和 limit 结合起来会允许可接受的性能。
推荐阅读
- javascript - 如何使用来自 Java 的等效代码将具有 BigInt MD5 Hash 的 MD5 转换为 NodeJs 中的字符串格式
- javascript - vscode运行js时弹出错误信息
- git - 尽管使用了 sudo,但在安装 git 时出现错误
- r - R警告要替换的项目数不是替换长度的倍数
- puppeteer - Puppeteer:page.type() 错过了字符串的前几个字符
- r - 如何在 R 中仅从 Wikipedia 下载部分 vcard 数据?
- r - R:根据匹配键重新编码多列
- javascript - 在 html/javascript 中从对象创建表
- node.js - 如何使用 cookie 或 301 获取请求?
- opengl-es - 绘制大量四边形时的制服或顶点属性?