On this page
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);