Introdução
Uma consulta exibida no terminal é útil uma vez. Um relatório que outras consultas possam reutilizar precisa de um resultado armazenado. Você transformará a consulta diária de vendas pagas da empresa varejista em uma pequena tabela do Hive e reconstruirá essa tabela com segurança quando o mesmo relatório for solicitado novamente.
A origem é texto CSV legível. ORC, Optimized Row Columnar, é um formato binário de armazenamento colunar: ele organiza valores por coluna dentro de sua estrutura de arquivo e pode permitir leituras analíticas eficientes. Não é outra linguagem SQL nem substitui o esquema da tabela. Os poucos dados de exemplo aqui demonstram armazenamento correto e reutilização, em vez de comprovar uma melhoria de velocidade.
Este laboratório prepara de forma independente os seis pedidos limpos em uma tabela externa de texto. O Hive está pronto. Você deve compreender tabelas externas, SELECT, agregação de vendas pagas e agrupamento por data. Aprenderá aqui as instruções de gravação de resultados, usando tabelas explicitamente não transacionais aceitas por este ambiente preparado. Não é necessário programar, instalar nem usar arquivos de laboratórios anteriores. Use o Terminal.
Defina uma tabela tipada de relatório ORC
Nesta etapa, você criará um destino vazio cujo esquema corresponde ao relatório pretendido. Assim como a origem CSV, o destino é uma tabela explicitamente externa com um local conhecido no HDFS. Seu formato é ORC em vez de texto. Externa descreve a relação entre metadados e arquivos; isso não significa que a tabela seja somente de leitura. O Hive pode gravar nela um resultado de SELECT. O local do resultado é separado da origem, portanto reconstruir o relatório não substituirá os pedidos originais.
Comece no espaço de trabalho:
cd /home/labex/project
A saída tem uma data, uma contagem e um total monetário por linha. COUNT(*) produz uma contagem BIGINT. DECIMAL(14,2) reserva quatorze dígitos decimais no total, dois após o ponto decimal; isso é suficiente para este pequeno relatório. O esquema explícito ajuda a evitar o armazenamento acidental de valores como texto.
Salve e execute a definição. O here-document grava SQL literalmente entre seus marcadores; o -f do Beeline executa esse arquivo no serviço preparado:
cat > /home/labex/project/queries/create-orc-report.sql <<'SQL'
CREATE EXTERNAL TABLE IF NOT EXISTS retail_orc.daily_sales (
order_date DATE,
paid_orders BIGINT,
revenue DECIMAL(14,2)
)
STORED AS ORC
LOCATION 'hdfs://localhost:9000/warehouse/external/retail_orc.db/daily_sales'
TBLPROPERTIES ('transactional'='false', 'external.table.purge'='false');
SQL
beeline -u 'jdbc:hive2://localhost:10000/default' -n labex --silent=true --showHeader=false --outputformat=tsv2 -f /home/labex/project/queries/create-orc-report.sql
STORED AS ORC seleciona o formato. LOCATION nomeia um novo diretório de resultado sob o diretório gravável de armazenamento do banco de dados preparado. external.table.purge=false mantém os arquivos se a definição externa for excluída; não impede uma sobrescrita explícita de substituir linhas do relatório. transactional=false solicita uma tabela não transacional. O Hive pode omitir essa propriedade false dos metadados exibidos; apenas um valor true marcaria a tabela como transacional. Este laboratório não ensina atualizações nem exclusões ACID. Inspecione os metadados e a contagem vazia de linhas:
beeline -u 'jdbc:hive2://localhost:10000/default' -n labex --silent=true --showHeader=false --outputformat=tsv2 -e "DESCRIBE FORMATTED retail_orc.daily_sales;" > /home/labex/project/output/orc-definition.txt
cat /home/labex/project/output/orc-definition.txt
beeline -u 'jdbc:hive2://localhost:10000/default' -n labex --silent=true --showHeader=false --outputformat=tsv2 -e "SELECT COUNT(*) FROM retail_orc.daily_sales;" > /home/labex/project/output/empty-report.tsv
cat /home/labex/project/output/empty-report.tsv
Localize os três tipos de coluna, o tipo de tabela externa e os nomes dos formatos de entrada e saída ORC. Espere 0 linhas: definir um destino não executou o cálculo de vendas nem copiou dados CSV. A seguir, você o preencherá explicitamente.
Grave e leia de volta o relatório diário
Nesta etapa, você executará o SELECT de vendas pagas e persistirá sua saída. INSERT OVERWRITE TABLE substitui o conteúdo atual da tabela de destino pelo resultado de SELECT. Ele não sobrescreve a tabela externa de pedidos que está sendo lida. Os valores selecionados são atribuídos às colunas de destino em ordem: data, contagem, receita.
Salve um script completo de reconstrução. CREATE TABLE IF NOT EXISTS permite executar novamente a definição quando a tabela corretamente definida já existe; ele não repara um esquema errado. O INSERT a seguir realiza a construção efetiva do relatório:
cat > /home/labex/project/queries/build-sales-report.sql <<'SQL'
CREATE EXTERNAL TABLE IF NOT EXISTS retail_orc.daily_sales (
order_date DATE,
paid_orders BIGINT,
revenue DECIMAL(14,2)
)
STORED AS ORC
LOCATION 'hdfs://localhost:9000/warehouse/external/retail_orc.db/daily_sales'
TBLPROPERTIES ('transactional'='false', 'external.table.purge'='false');
INSERT OVERWRITE TABLE retail_orc.daily_sales
SELECT order_date, COUNT(*) AS paid_orders,
SUM(quantity * unit_price) AS revenue
FROM retail_orc.orders
WHERE order_status = 'paid'
GROUP BY order_date;
SQL
beeline -u 'jdbc:hive2://localhost:10000/default' -n labex --silent=true --showHeader=false --outputformat=tsv2 -f /home/labex/project/queries/build-sales-report.sql
A conclusão bem-sucedida significa que a gravação terminou. Confirme consultando a tabela ORC armazenada, em vez de simplesmente repetir o SELECT original da origem:
beeline -u 'jdbc:hive2://localhost:10000/default' -n labex --silent=true --showHeader=false --outputformat=tsv2 -e "SELECT order_date, paid_orders, revenue FROM retail_orc.daily_sales ORDER BY order_date;" > /home/labex/project/output/stored-report.tsv
cat /home/labex/project/output/stored-report.tsv
Espere 14 de outubro / 2 / 45.00 e 15 de outubro / 2 / 80.00. A exibição monetária pode incluir zeros finais. São duas linhas de resultado armazenadas resumindo quatro pedidos pagos da origem; não são seis cópias dos registros CSV originais.
Arquivos ORC são binários, portanto usar cat para visualizar seus bytes não produziria um CSV legível. O Hive interpreta o esquema e o formato de arquivo da tabela quando você executa SELECT nela. Os arquivos de origem continuam sendo texto comum e mantêm os seis pedidos, incluindo os dois status excluídos.
Reconstrua sem acumular dias duplicados
Nesta etapa, você testará a repetibilidade. Preveja a contagem de linhas ao executar o mesmo script de sobrescrita novamente. O destino ainda deverá ter duas datas, em vez de quatro linhas copiadas de resumo:
beeline -u 'jdbc:hive2://localhost:10000/default' -n labex --silent=true --showHeader=false --outputformat=tsv2 -f /home/labex/project/queries/build-sales-report.sql
beeline -u 'jdbc:hive2://localhost:10000/default' -n labex --silent=true --showHeader=false --outputformat=tsv2 -e "SELECT order_date, paid_orders, revenue FROM retail_orc.daily_sales ORDER BY order_date;" > /home/labex/project/output/rebuilt-report.tsv
cat /home/labex/project/output/rebuilt-report.tsv
O relatório ainda deverá ser 14 de outubro / 2 / 45.00 e 15 de outubro / 2 / 80.00. Confira uma conciliação compacta diretamente da tabela de resultado:
beeline -u 'jdbc:hive2://localhost:10000/default' -n labex --silent=true --showHeader=false --outputformat=tsv2 -e "SELECT COUNT(*), SUM(paid_orders), SUM(revenue) FROM retail_orc.daily_sales;" > /home/labex/project/output/report-reconciliation.tsv
cat /home/labex/project/output/report-reconciliation.tsv
Espere 2 linhas de relatório armazenadas, 4 pedidos pagos da origem e receita de 125.00. A contagem de linhas do resultado e sua soma de paid_orders descrevem níveis diferentes de detalhe.
Compare localmente os dados salvos de antes e depois. Como ambas as instruções SELECT usam ORDER BY, a ordem das linhas de dados é estável. O Beeline pode incluir mensagens do cliente, portanto a comparação significativa é a das linhas datadas de resultado e da conciliação numérica, em vez dos horários das mensagens.
Essa reconstrução é idempotente para uma entrada inalterada: repeti-la mantém o mesmo conteúdo do relatório. A seguir, um destino descartável mostrará por que o modo de gravação importa.
Compare acréscimo e sobrescrita em uma cópia descartável
Nesta etapa, você duplicará intencionalmente um pequeno relatório derivado em uma tabela separada. Sua tabela principal daily_sales continua sendo o relatório correto. Crie a tabela descartável com o mesmo esquema explícito:
beeline -u 'jdbc:hive2://localhost:10000/default' -n labex --silent=true --showHeader=false --outputformat=tsv2 -e "CREATE EXTERNAL TABLE IF NOT EXISTS retail_orc.append_demo (
order_date DATE,
paid_orders BIGINT,
revenue DECIMAL(14,2)
)
STORED AS ORC
LOCATION 'hdfs://localhost:9000/warehouse/external/retail_orc.db/append_demo'
TBLPROPERTIES ('transactional'='false', 'external.table.purge'='false');"
INSERT INTO TABLE acrescenta resultados de SELECT ao conteúdo existente. Acrescente o relatório principal de duas linhas duas vezes:
beeline -u 'jdbc:hive2://localhost:10000/default' -n labex --silent=true --showHeader=false --outputformat=tsv2 -e "INSERT INTO TABLE retail_orc.append_demo SELECT order_date, paid_orders, revenue FROM retail_orc.daily_sales;"
beeline -u 'jdbc:hive2://localhost:10000/default' -n labex --silent=true --showHeader=false --outputformat=tsv2 -e "INSERT INTO TABLE retail_orc.append_demo SELECT order_date, paid_orders, revenue FROM retail_orc.daily_sales;"
beeline -u 'jdbc:hive2://localhost:10000/default' -n labex --silent=true --showHeader=false --outputformat=tsv2 -e "SELECT COUNT(*), SUM(paid_orders), SUM(revenue) FROM retail_orc.append_demo;" > /home/labex/project/output/append-observation.tsv
cat /home/labex/project/output/append-observation.tsv
Espere 4 linhas, 8 pedidos pagos somados e receita de 250.00. As linhas extras representam cópias duplicadas do relatório, não novas vendas. Nenhum pedido novo chegou; acrescentar uma reconstrução completa produziu o resultado de negócio errado.
Substitua o conteúdo descartável por uma cópia usando o modo de gravação aprendido anteriormente:
beeline -u 'jdbc:hive2://localhost:10000/default' -n labex --silent=true --showHeader=false --outputformat=tsv2 -e "INSERT OVERWRITE TABLE retail_orc.append_demo SELECT order_date, paid_orders, revenue FROM retail_orc.daily_sales;"
beeline -u 'jdbc:hive2://localhost:10000/default' -n labex --silent=true --showHeader=false --outputformat=tsv2 -e "SELECT order_date, paid_orders, revenue FROM retail_orc.append_demo ORDER BY order_date;" > /home/labex/project/output/overwrite-observation.tsv
cat /home/labex/project/output/overwrite-observation.tsv
Ela volta às duas linhas diárias corretas. Para uma pequena conferência prática, repita essa sobrescrita mais uma vez:
beeline -u 'jdbc:hive2://localhost:10000/default' -n labex --silent=true --showHeader=false --outputformat=tsv2 -e "INSERT OVERWRITE TABLE retail_orc.append_demo SELECT order_date, paid_orders, revenue FROM retail_orc.daily_sales;"
beeline -u 'jdbc:hive2://localhost:10000/default' -n labex --silent=true --showHeader=false --outputformat=tsv2 -e "SELECT COUNT(*), SUM(revenue) FROM retail_orc.append_demo;"
Espere novamente 2 linhas e 125.00. Acrescentar é útil ao adicionar dados realmente novos e sem sobreposição; reconstruir um retrato completo exige substituição. Seu script principal salvo de construção usa sobrescrita, portanto pode reconstruir o relatório completo sem acumular silenciosamente datas duplicadas.
Resumo
Você definiu uma tabela tipada de resultado ORC não transacional, gravou totais diários de vendas pagas, leu-os de volta e testou uma reconstrução repetível. Um experimento descartável de acréscimo demonstrou como cópias duplicadas de relatório inflam a receita e como a sobrescrita restaura um retrato completo. A seguir, você diagnosticará erros comuns de mapeamento de arquivos para tabelas antes do desafio final de relatório.



