提示
Hive SQL 教程 欢迎使用。提供建议、纠错、催更等加作者微信: gairuo123(备注:sql )和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
在数据探查中,我们经常需要查看数据的样本, 来对数据有一个整体的了解,同时分析数据的质量情况。 Hive SQL 的 TABLESAMPLE 语句的作用是查看数据样本的好方法。
TABLESAMPLE 有两种用法:
-- table_sample
TABLESAMPLE (BUCKET x OUT OF y [ON colname])
-- block_sample
TABLESAMPLE (n ROWS)
采样分桶表和块采样。
TABLESAMPLE 子句允许用户为数据样本而不是整个表编写查询。语法为:
table_sample: TABLESAMPLE (BUCKET x OUT OF y [ON colname])
在以下示例中,表源的 32 个存储桶中的第 3 个存储桶。 's' 是表别名。
SELECT *
FROM source TABLESAMPLE(BUCKET 3 OUT OF 32 ON rand()) s;
输入修剪:通常,TABLESAMPLE 将扫描整个表并获取样本。 但是,这不是很有效。
相反,可以使用 CLUSTERED BY 子句创建表,该子句指示表在其上进行散列分区/集群的列集。
如果 TABLESAMPLE 子句中指定的列与 CLUSTERED BY 子句中的列匹配,则 TABLESAMPLE 仅扫描表的所需散列分区。
例子:
所以在上面的例子中,如果表 'source' 是用 CLUSTERED BY id INTO 32 BUCKETS
创建的
TABLESAMPLE(BUCKET 3 OUT OF 16 ON id)
将挑选出第 3 和第 19 个集群,因为每个桶将由 (32/16)=2 个集群组成。
另一方面,tablesample 子句
TABLESAMPLE(BUCKET 3 OUT OF 64 ON id)
将挑选出第三个集群的一半,因为每个桶将由一个集群的 (32/64)=1/2 组成。
从 Hive 0.8 开始提供块采样。
block_sample: TABLESAMPLE (n PERCENT)
这将允许 Hive 获取至少 n% 的数据大小(注意它并不一定意味着行数)作为输入。
仅支持 CombineHiveInputFormat,不处理一些特殊的压缩格式。
如果我们无法对其进行采样,则 MapReduce 作业的输入将是整个表/分区。 我们在 HDFS 块级别执行此操作,以便采样粒度为块大小。
例如,如果块大小为 256MB,即使输入大小的 n% 仅为 100MB,您也会得到 256MB 的数据。
在以下示例中,输入大小 0.1% 或更大将用于查询。
SELECT *
FROM source TABLESAMPLE(0.1 PERCENT) s;
有时你想用不同的块对相同的数据进行采样,你可以改变这个种子数:
set hive.sample.seednumber=<INTEGER>;
或者用户可以指定要读取的总长度,但它与 PERCENT 采样有相同的限制。
block_sample: TABLESAMPLE (ByteLengthLiteral)
ByteLengthLiteral : (Digit)+ ('b' | 'B' | 'k' | 'K' | 'm' | 'M' | 'g' | 'G')
在以下示例中,输入大小 100M 或更大将用于查询。
SELECT *
FROM source TABLESAMPLE(100M) s;
Hive 还支持按行数限制输入,但与上述两个不同。 首先,它不需要 CombineHiveInputFormat,这意味着它可以与非本地表一起使用。 其次,用户给出的行数应用于每个拆分。 因此总行数可能因输入拆分数而异。
block_sample: TABLESAMPLE (n ROWS)
例如,以下查询将从每个输入拆分中获取前 10 行。
SELECT * FROM source TABLESAMPLE(10 ROWS);
更新时间:2022-06-22 08:23:22 标签:hive sql hql 样本