LanguageManual Sampling

Sampling Syntax

抽样存储桶表

table_sample: TABLESAMPLE (BUCKET x OUT OF y [ON colname])

TABLESAMPLE 子句允许用户为数据 samples 而不是整个表编写查询。 TABLESAMPLE 子句可以添加到 FROM 子句中的任何表中。桶的编号从 1 开始。 colname 表示要对表中的每一行进行采样的列。 colname 可以是表中的非分区列之一,也可以是 rand()**,它表示对整个行进行采样,而不是对单个列进行采样。表格中的行在同名上随机存储到 y 个存储桶中,编号从 1 到 y。返回属于存储桶 x 的行。

在以下示例中,表源的 32 个存储桶中的第三个存储桶。 “ s”是表别名。

SELECT *
FROM source TABLESAMPLE(BUCKET 3 OUT OF 32 ON rand()) s;

Importing 修剪 :通常,TABLESAMPLE 将扫描整个表并获取 samples。但是,这不是很有效。相反,可以使用 CLUSTERED BY 子句创建表,该子句指示对表进行哈希分区/集群的列集。如果 TABLESAMPLE 子句中指定的列与 CLUSTERED BY 子句中的列匹配,则 TABLESAMPLE 仅扫描表的所需哈希分区。

Example:

因此,在上面的示例中,如果表'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 集群组成。

有关使用 CLUSTERED BY 子句创建存储桶表的信息,请参见Create Table(尤其是桶排序表)和Bucketed Tables

Block Sampling

从 Hive 0.8 开始提供块采样。在 JIRA 下寻址-https://issues.apache.org/jira/browse/HIVE-2121

block_sample: TABLESAMPLE (n PERCENT)

这将允许 Hive 至少获取 n%的数据大小(注意,它不一定表示行数)作为 Importing。仅支持 CombineHiveInputFormat,并且不处理某些特殊的压缩格式。如果我们无法对其进行采样,则 MapReduce 作业的 Importing 将是整个表/分区。我们在 HDFS 块级别执行此操作,以便采样粒度为块大小。例如,如果块大小为 256MB,那么即使 Importing 大小的 n%仅 100MB,您也将获得 256MB 的数据。

在以下示例中,Importing 大小为 0.1%或更大将用于查询。

SELECT *
FROM source TABLESAMPLE(0.1 PERCENT) s;

有时,您想使用不同的块来采样相同的数据,则可以更改此种子编号:

set hive.sample.seednumber=<INTEGER>;

或者,用户可以指定要读取的总长度,但是它与 PERCENT 采样具有相同的限制。 (从 Hive 0.10.0-https://issues.apache.org/jira/browse/HIVE-3401开始)

block_sample: TABLESAMPLE (ByteLengthLiteral)

ByteLengthLiteral : (Digit)+ ('b' | 'B' | 'k' | 'K' | 'm' | 'M' | 'g' | 'G')

在以下示例中,Importing 大小为 100M 或更大将用于查询。

SELECT *
FROM source TABLESAMPLE(100M) s;

Hive 还支持按行数限制 Importing,但对于以上两种,其行为有所不同。首先,它不需要 CombineHiveInputFormat,这意味着它可以与 nonlocal 表一起使用。其次,将用户给定的行数应用于每个拆分。因此,总行数可以根据 Importing 拆分的数量而变化。 (从 Hive 0.10.0-https://issues.apache.org/jira/browse/HIVE-3401开始)

block_sample: TABLESAMPLE (n ROWS)

例如,以下查询将从每个 Importing 拆分中获取前 10 行。

SELECT * FROM source TABLESAMPLE(10 ROWS);
首页