Анализ данных с использованием коллекций именованных структур
В этом шаге вы узнаете, как использовать функцию named_struct
в Hive для создания сложных структур данных и более эффективного анализа телеметрических данных.
Во - первых, создадим новую таблицу Hive со вложенной структурой для хранения дополнительной информации о гонщиках:
CREATE TABLE racer_info (
id INT,
racer STRUCT<name:STRING, team:STRING, age:INT>,
performance STRUCT<speed:DOUBLE, altitude:DOUBLE, total_score:DOUBLE>
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
COLLECTION ITEMS TERMINATED BY '#'
STORED AS TEXTFILE;
Теперь вставим несколько примерных данных в таблицу racer_info
:
INSERT INTO TABLE racer_info
VALUES
(1, named_struct('name', 'Benny', 'team', 'Cosmic Racers', 'age', 28), named_struct('speed', CAST(32.5 AS DOUBLE), 'altitude', CAST(12.7 AS DOUBLE), 'total_score', CAST(45.2 AS DOUBLE))),
(2, named_struct('name', 'Zara', 'team', 'Stellar Speeders', 'age', 32), named_struct('speed', CAST(28.9 AS DOUBLE), 'altitude', CAST(14.1 AS DOUBLE), 'total_score', CAST(43.0 AS DOUBLE))),
(3, named_struct('name', 'Alex', 'team', 'Galactic Gliders', 'age', 25), named_struct('speed', CAST(30.2 AS DOUBLE), 'altitude', CAST(11.5 AS DOUBLE), 'total_score', CAST(41.7 AS DOUBLE))),
(4, named_struct('name', 'Benny', 'team', 'Cosmic Racers', 'age', 28), named_struct('speed', CAST(35.7 AS DOUBLE), 'altitude', CAST(10.2 AS DOUBLE), 'total_score', CAST(45.9 AS DOUBLE))),
(5, named_struct('name', 'Zara', 'team', 'Stellar Speeders', 'age', 32), named_struct('speed', CAST(31.1 AS DOUBLE), 'altitude', CAST(12.8 AS DOUBLE), 'total_score', CAST(43.9 AS DOUBLE))),
(6, named_struct('name', 'Alex', 'team', 'Galactic Gliders', 'age', 25), named_struct('speed', CAST(29.8 AS DOUBLE), 'altitude', CAST(15.7 AS DOUBLE), 'total_score', CAST(45.5 AS DOUBLE)));
Теперь проанализируем данные с использованием функции named_struct
:
- Получить имена гонщиков и их команды.
SELECT racer.name, racer.team FROM racer_info;
- Получить имена гонщиков и их максимальные скорости.
SELECT racer.name, performance.speed AS max_speed FROM racer_info;
- Получить имена гонщиков, их команды и их средние баллы.
SELECT racer.name, racer.team, AVG(performance.total_score) AS average_score
FROM racer_info
GROUP BY racer.name, racer.team;
Эти примеры демонстрируют, как использовать функцию named_struct
для создания сложных структур данных и анализа данных.