Use TABLESAMPLE para amostrar linhas de uma tabela sem examinar todo o conjunto de dados. Três métodos de amostragem estão disponíveis:
TABLESAMPLE (BUCKET x OUT OF y [ON col_name | RAND()])— retorna um bucket dentre y partições de tamanho igualTABLESAMPLE (n PERCENT)— retorna aproximadamente n% das linhasTABLESAMPLE (m ROWS)— retorna até m linhas aleatoriamente
A amostragem baseada em porcentagem gera resultados aproximados. A porcentagem real pode diferir do valor especificado.
Sintaxe
Amostragem por bucket
TABLESAMPLE (BUCKET <x> OUT OF <y> [ON <col_name> | RAND()])
|
Parâmetro |
Descrição |
|
|
Bucket a amostrar. A numeração dos buckets começa em 1. |
|
|
Número total de buckets para dividir os dados. |
|
|
Uma ou mais colunas usadas para distribuir as linhas nos buckets. Especifique até 10 colunas em uma única cláusula |
|
|
Distribui as linhas nos buckets aleatoriamente, em vez de usar valores de coluna. Use quando nenhuma distribuição específica por coluna for necessária. |
Para tabelas não clusterizadas, inclua ON col_name ou ON RAND().
Amostragem por porcentagem
TABLESAMPLE (<n> PERCENT)
O parâmetro n representa a porcentagem da amostragem. O resultado contém cerca de n% das linhas da tabela source. Esse valor não é exato.
Amostragem por linhas
TABLESAMPLE (<m> ROWS)
O valor m indica o número de linhas a retornar. Se a tabela source tiver menos linhas que m, todas as linhas serão retornadas. O valor máximo para m é 10.000.
Considerações sobre desempenho
Tabelas clusterizadas oferecem leitura mais rápida. Como os dados já estão pré-organizados em buckets, a amostragem por bucket acessa diretamente o bucket alvo e evita a varredura de dados irrelevantes.
Escolha valores de y alinhados ao número de buckets da tabela. Para uma tabela clusterizada com 32 buckets, defina
ycomo um múltiplo de 32 (como 32, 64 ou 128) ou um divisor de 32 (como 16, 8 ou 4) para evitar leituras parciais de buckets.
Dados de exemplo
Os exemplos a seguir usam duas tabelas.
**BIGDATA_PUBLIC_DATASET.life_service.phoneno_basic_info_2020** — tabela dos conjuntos de dados públicos do MaxCompute. Para mais detalhes, consulte Overview.
**tblsample_test** — tabela clusterizada criada com os seguintes comandos:
-- Create the tblsample_test table.
CREATE TABLE tblsample_test(a bigint, b string, c string)
CLUSTERED BY (a, c) SORTED by (a, c) INTO 32 BUCKETS;
-- Insert data into the table.
INSERT OVERWRITE TABLE tblsample_test VALUES
(1,"b1","c1"),
(2,"b2","c2"),
(3,"b3","c3"),
(4,"b4","c4");
-- Verify the inserted data.
SELECT * FROM tblsample_test;
-- Result:
-- +------------+----+-----+
-- | a | b | c |
-- +------------+----+-----+
-- | 2 | b2 | c2 |
-- | 4 | b4 | c4 |
-- | 3 | b3 | c3 |
-- | 1 | b1 | c1 |
-- +------------+----+-----+
Exemplos
Exemplo 1: Amostragem por valores de coluna
Distribua as linhas em buckets com base nos valores das colunas e retorne as linhas de um bucket específico.
-- Sample bucket 1 out of 1,000,000 from the public dataset, bucketed by isp_code, phoneno, and province.
SELECT isp_code,
phoneno,
province
FROM BIGDATA_PUBLIC_DATASET.life_service.phoneno_basic_info_2020
TABLESAMPLE (BUCKET 1 OUT OF 1000000 ON isp_code, phoneno, province) s;
-- Result:
-- +----------+---------+----------+
-- | isp_code | phoneno | province |
-- +----------+---------+----------+
-- | 185 | 1853500 | Shanxi |
-- | 187 | 1878332 | Sichuan |
-- +----------+---------+----------+
Exemplo 2: Amostragem com atribuição aleatória de buckets
Use RAND() para distribuir as linhas nos buckets aleatoriamente e retorne um bucket específico.
-- Sample bucket 3 out of 500,000 using random bucket assignment.
SELECT isp_code,
phoneno,
province
FROM BIGDATA_PUBLIC_DATASET.life_service.phoneno_basic_info_2020
TABLESAMPLE (BUCKET 3 OUT OF 500000 ON RAND()) s;
-- Result:
-- +----------+---------+----------+
-- | isp_code | phoneno | province |
-- +----------+---------+----------+
-- | 131 | 1312224 | Shanghai |
-- | 135 | 1353936 | Guangdong |
-- | 158 | 1586377 | Shandong |
-- +----------+---------+----------+
Exemplo 3: Amostragem de tabela clusterizada sem especificar ON
Para tabelas clusterizadas, omita a cláusula ON. As linhas são obtidas diretamente do bucket pré-organizado.
SELECT a, b FROM tblsample_test TABLESAMPLE (BUCKET 1 OUT OF 2) AS ts;
-- Result:
-- +------------+----+
-- | a | b |
-- +------------+----+
-- | 2 | b2 |
-- +------------+----+
A tabela tblsample_test tem 32 buckets. Ao usar y = 2 (um divisor de 32), o MaxCompute recupera dados exatamente nos limites dos buckets, o que melhora o desempenho. Consulte Considerações sobre desempenho.
Exemplo 4: Amostragem por porcentagem
Retorne aproximadamente 50% das linhas de tblsample_test.
SELECT * FROM tblsample_test TABLESAMPLE (50 PERCENT) s;
-- Result:
-- +------------+----+----+
-- | a | b | c |
-- +------------+----+----+
-- | 2 | b2 | c2 |
-- | 3 | b3 | c3 |
-- +------------+----+----+
Exemplo 5: Amostragem de um número fixo de linhas
Retorne 2 linhas de tblsample_test.
SELECT * FROM tblsample_test TABLESAMPLE (2 ROWS);
-- Result:
-- +------------+----+----+
-- | a | b | c |
-- +------------+----+----+
-- | 2 | b2 | c2 |
-- | 3 | b3 | c3 |
-- +------------+----+----+