Введение
В мире, где границы между измерениями рассеиваются, в тканях реальности появился разрыв, позволивший проникнуть сюда внеземной существо. Это существо, называемое Кристаллическим Предвестником, является чувствующимся существом, состоящее из чистой энергии, его форма меняется и мерцает, подобно калейдоскопу света.
Целью Кристаллического Предвестника является овладеть силой данных, чтобы重塑ть самой ткань бытия. Для этого он стремится овладеть сложностями Hadoop, мощной платформы для обработки больших данных. Однако понимание Hadoop у Предвестника неполноценно, и ему нужна помощь, чтобы раскрыть все возможности предложения "having" в Hive, компоненте для хранения данных в Hadoop.
Ваша миссия, если вы решите принять ее, - помочь Кристаллическому Предвестнику пройти серию шагов, раскрыть секреты предложения "having" и позволить ему использовать силу данных способами, которые никто раньше не мог себе представить.
Понять назначение предложения 'having'
В этом шаге мы исследуем основное назначение предложения "having" в Hive и то, как оно связано с фильтрацией и агрегацией данных.
Предложение "having" в Hive используется совместно с предложением "group by" для фильтрации групп данных по заданному условию. Это позволяет применить фильтр после того, как данные были сгруппированы и агрегированы, и позволяет отфильтровать целые группы, которые не соответствуют заданным критериям.
Вот пример, демонстрирующий использование предложения "having":
Во - первых, убедитесь, что вы вошли под пользователем hadoop, выполнив следующую команду в терминале:
su - hadoop
Затем запустите Hive - shell, выполнив следующую команду:
hive
Теперь создайте таблицу - пример:
CREATE TABLE sales (
product STRING,
category STRING,
sales_amount FLOAT
);
Вставьте несколько примеров данных:
INSERT INTO sales VALUES
('Product A', 'Electronics', 1000.0),
('Product B', 'Electronics', 2000.0),
('Product C', 'Clothing', 500.0),
('Product D', 'Clothing', 1500.0),
('Product E', 'Electronics', 3000.0);
Наконец, вычислите общие продажи по категориям и отфильтруйте категории с общим объемом продаж более 3000:
CREATE TABLE result_1
AS
SELECT category, SUM(sales_amount) AS total_sales
FROM sales
GROUP BY category
HAVING SUM(sales_amount) > 3000;
SELECT * FROM result_1;
В этом примере мы сначала создаем таблицу sales с колонками product, category и sales_amount. Затем мы вставляем несколько примеров данных в таблицу.
Далее мы используем предложение "group by" для группировки данных по category, и функцию SUM для вычисления общего объема продаж для каждой категории. Затем предложение "having" используется для отфильтрации категорий, где total_sales меньше или равно 3000.
Результат этого запроса будет включать только категорию "Electronics", так как ее общие продажи (2000.0 + 1000.0 + 3000.0 = 6000.0) превышают 3000, в то время как категория "Clothing" будет исключена, потому что ее общие продажи (500.0 + 1500.0 = 2000.0) не соответствуют условию, заданному в предложении "having".
Фильтрация групп на основе нескольких условий
Хотя предыдущий шаг показал базовое использование предложения "having", Hive также позволяет фильтровать группы по нескольким условиям с использованием логических операторов, таких как AND и OR.
Вот пример, демонстрирующий, как использовать несколько условий в предложении "having":
Вычислите общие продажи по продукту и категории и отфильтруйте продукты с общим объемом продаж более 2000 и принадлежащие к категории 'Electronics':
CREATE TABLE result_2
AS
SELECT product, category, SUM(sales_amount) AS total_sales
FROM sales
GROUP BY product, category
HAVING SUM(sales_amount) > 2000 AND category = 'Electronics';
SELECT * FROM result_2;
В этом примере мы группируем данные по product и category и вычисляем общие продажи для каждой комбинации product и category. Затем предложение "having" используется для отфильтрации групп, где total_sales меньше или равно 2000, и category не равна "Electronics".
Результат этого запроса будет включать только продукты, принадлежащие к категории "Electronics" с общим объемом продаж более 2000, такие как "Product B" и "Product E".
Вы также можете использовать оператор OR для комбинирования нескольких условий в предложении "having":
Вычислите общие продажи по продукту и категории и отфильтруйте продукты с общим объемом продаж более 2000 или принадлежащие к категории 'Clothing':
SELECT product, category, SUM(sales_amount) AS total_sales
FROM sales
GROUP BY product, category
HAVING SUM(sales_amount) > 2000 OR category = 'Clothing';
Этот запрос будет включать все продукты с общим объемом продаж более 2000, независимо от их категории, а также все продукты, принадлежащие к категории "Clothing", независимо от их общего объема продаж.
Использовать агрегатные функции в предложении 'having'
Предложение "having" также можно использовать совместно с агрегатными функциями, такими как COUNT, MAX, MIN и AVG. Это позволяет фильтровать группы на основе условий, связанных с этими агрегатными функциями.
Вот пример, демонстрирующий использование функции COUNT в предложении "having":
Вычислите количество продуктов в каждой категории и отфильтруйте категории, в которых более 2 продуктов:
CREATE TABLE result_3
AS
SELECT category, COUNT(product) AS product_count
FROM sales
GROUP BY category
HAVING COUNT(product) > 2;
SELECT * FROM result_3;
В этом примере мы используем функцию COUNT для подсчета количества продуктов в каждой category. Затем предложение "having" используется для отфильтрации категорий, где product_count меньше или равно 2.
Результат этого запроса будет включать только те категории, которые имеют более 2 продуктов, связанных с ними.
Вы также можете комбинировать агрегатные функции с другими условиями в предложении "having":
Вычислите максимальную сумму продаж для каждой категории и отфильтруйте категории с максимальными продажами более 2000 и более 2 продуктов:
SELECT category, MAX(sales_amount) AS max_sales, COUNT(product) AS product_count
FROM sales
GROUP BY category
HAVING MAX(sales_amount) > 2000 AND COUNT(product) > 2;
Этот запрос вычисляет максимальную сумму продаж (max_sales) и количество продуктов (product_count) для каждой категории. Предложение "having" фильтрует категории, где max_sales меньше или равно 2000, или product_count меньше или равно 2.
Объединить предложения 'where' и 'having'
Предложения "where" и "having" в запросах Hive служат разным целям. Предложение "where" используется для фильтрации отдельных строк до группировки и агрегации данных, в то время как предложение "having" используется для фильтрации групп данных после их группировки и агрегации.
В некоторых случаях вам может потребоваться объединить оба предложения в одном запросе, чтобы добиться нужного поведения фильтрации. Вот пример, демонстрирующий, как объединить предложения "where" и "having":
Вычислите общие продажи по категории, отфильтруйте продукты с суммой продаж более 1000 и отфильтруйте категории с общим объемом продаж более 3000:
CREATE TABLE result_4
AS
SELECT category, SUM(sales_amount) AS total_sales
FROM sales
WHERE sales_amount > 1000
GROUP BY category
HAVING SUM(sales_amount) > 3000;
SELECT * FROM result_4;
В этом примере мы сначала используем предложение "where" для отфильтрации отдельных строк, где sales_amount меньше или равно 1000. Это означает, что только продукты с суммой продаж более 1000 будут учтены при последующей группировке и агрегации.
Далее мы группируем отфильтрованные данные по category и вычисляем общие продажи для каждой категории с использованием функции SUM. Наконец, предложение "having" используется для отфильтрации категорий, где total_sales меньше или равно 3000.
Результат этого запроса будет включать только те категории с общим объемом продаж более 3000, вычисленные из продуктов с суммой продаж более 1000.
Резюме
В этом практическом занятии мы провели путешествие, чтобы показать Кристоаллическую Предвестницу сложности предложения "having" в Hive. Освоив эту мощную функцию, Предвестница теперь может фильтровать и анализировать данные с небы前所未有的精度,揭开多元宇宙海量数据宝库的秘密。
通过一系列步骤,我们探索了“having”子句的基本用途,展示了它根据指定条件过滤数据组的能力。然后我们深入研究,学习如何使用逻辑运算符应用多个条件,在“having”子句中利用聚合函数,以及为复杂的数据过滤场景组合“where”和“having”子句。
在整个这个实验中,水晶先知获得了宝贵的知识和技能,使它能够发挥 Hadoop 的真正潜力,并通过数据分析的力量重塑存在的结构。每走一步,我们都开启了新的可能性,使先知能够以前所未有的精度和控制在广阔的数据领域中导航。



