宇宙レーシングデータの最適化

HadoopBeginner
オンラインで実践に進む

はじめに

未来、宇宙全体に広がる危険なレースコースで高賭けの宇宙レーシングトーナメントが開催されます。宇宙レーシング安全担当官として、主な責任は、レースコースと参加する宇宙船を密に監視することで、これらの宇宙レースの安全と公正を確保することです。

このミッションは、レースコースのさまざまな区間から収集されたテレメトリデータを分析して、潜在的な危険やレース違反を特定し、競技者と観客双方にとってのレーシング体験を最適化することです。Hadoop の強力なデータ処理機能を活用することで、宇宙レースの信頼性と興奮感を維持するのに役立つ貴重な洞察を明らかにすることができます。

Hive におけるコレクション操作関数を探索する

このステップでは、Hive でコレクション操作関数を使用して、レースコースから収集されたテレメトリデータを処理および分析する方法を学びます。

まず、ターミナルで以下のコマンドを実行して、hadoopユーザーとしてログインしてください。

su - hadoop

次に、使用するサンプルデータセットを作成しましょう。テキストエディタを開き、以下の内容でracetrack_data.txtという名前の新しいファイルを作成します。

1,Sector1,Benny,32.5,12.7,45.2
2,Sector2,Zara,28.9,14.1,43.0
3,Sector1,Alex,30.2,11.5,41.7
4,Sector3,Benny,35.7,10.2,45.9
5,Sector2,Zara,31.1,12.8,43.9
6,Sector3,Alex,29.8,15.7,45.5

このデータセットは、レースコースの異なるセクターからのテレメトリデータを表しており、列はレコード ID、セクター名、レーサー名、速度、高度、および合計得点を表しています。

次に、Hive CLI を起動しましょう。

hive

次に、このデータを格納する新しい Hive テーブルを作成します。

CREATE TABLE racetrack_data (
    id INT,
    sector STRING,
    racer STRING,
    speed DOUBLE,
    altitude DOUBLE,
    total_score DOUBLE
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
STORED AS TEXTFILE;

racetrack_data.txtファイルからのデータを Hive テーブルに読み込みます。

LOAD DATA LOCAL INPATH '/home/hadoop/racetrack_data.txt' OVERWRITE INTO TABLE racetrack_data;

次に、Hive におけるいくつかのコレクション操作関数を探索しましょう。

  1. 一意のレーサー名の一覧を取得します。
SELECT DISTINCT racer FROM racetrack_data;
  1. セクター名と各セクターのレコード数の一覧を取得します。
SELECT sector, COUNT(*) AS record_count FROM racetrack_data GROUP BY sector;
  1. 各レーサーの最大速度を取得します。
SELECT racer, MAX(speed) AS max_speed FROM racetrack_data GROUP BY racer;
  1. レーサーとその平均得点の一覧を取得します。
SELECT racer, AVG(total_score) AS avg_score FROM racetrack_data GROUP BY racer;

これらの例は、DISTINCTCOUNTMAX、およびAVGのような関数を使用してテレメトリデータを分析し、貴重な洞察を抽出する方法を示しています。

名前付き構造体コレクションを使ってデータを分析する

このステップでは、Hive のnamed_struct関数を使って複雑なデータ構造を作成し、テレメトリデータをより効果的に分析する方法を学びます。

まず、追加のレーサー情報を格納するネスト構造を持つ新しい 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関数を使ってデータを分析しましょう。

  1. レーサー名とその所属チームを取得します。
SELECT racer.name, racer.team FROM racer_info;
  1. レーサー名とその最大速度を取得します。
SELECT racer.name, performance.speed AS max_speed FROM racer_info;
  1. レーサー名、所属チーム、および平均得点を取得します。
SELECT racer.name, racer.team, AVG(performance.total_score) AS average_score
FROM racer_info
GROUP BY racer.name, racer.team;

これらの例は、複雑なデータ構造を作成し、データを分析するためのnamed_struct関数の使い方を示しています。

コレクションセット関数を使ってデータを分析する

このステップでは、Hive のcollect_set関数を使ってテレメトリデータに対して集合演算を行う方法を学びます。

まず、レーサーの順位を格納する新しい Hive テーブルを作成しましょう。

CREATE TABLE racer_rankings (
    race_id INT,
    sector STRING,
    racer_names ARRAY<STRING>
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
COLLECTION ITEMS TERMINATED BY '#'
STORED AS TEXTFILE;

次に、いくつかのサンプルデータをracer_rankingsテーブルに挿入しましょう。

INSERT INTO TABLE racer_rankings
VALUES
    (1, 'Sector1', ARRAY('Benny', 'Alex')),
    (2, 'Sector2', ARRAY('Zara', 'Alex')),
    (3, 'Sector3', ARRAY('Benny', 'Zara', 'Alex')),
    (4, 'Sector1', ARRAY('Benny', 'Zara')),
    (5, 'Sector2', ARRAY('Zara', 'Alex')),
    (6, 'Sector3', ARRAY('Benny', 'Alex'));

次に、collect_set関数を使ってデータを分析しましょう。

  1. すべてのセクターにおける一意のレーサーの一覧を取得します。
SELECT DISTINCT racer_name
FROM racer_rankings
LATERAL VIEW EXPLODE(racer_names) rn AS racer_name;
  1. すべてのセクターに参加したレーサーの一覧を取得します。
SELECT racer_name
FROM (
  SELECT collect_set(racer_names) AS all_racers
  FROM racer_rankings
) t
LATERAL VIEW EXPLODE(all_racers) rn AS racer_name;
  1. 少なくとも 2 つのセクターに参加したレーサーの一覧を取得します。
SELECT racer_name
FROM (
  SELECT racer_name, COUNT(DISTINCT sector) AS num_sectors
  FROM racer_rankings LATERAL VIEW explode(racer_names) exploded_table AS racer_name
  GROUP BY racer_name
) t
WHERE num_sectors >= 2;

これらの例は、collect_set関数を使ってテレメトリデータに対してDISTINCTINTERSECTION、およびUNIONのような集合演算を行う方法を示しています。

まとめ

この実験では、Hive におけるさまざまなコレクション操作関数、たとえばDISTINCTCOUNTMAXAVGnamed_structLATERAL VIEWEXPLODE、およびcollection_setを探索しました。宇宙レーシングトーナメントからのテレメトリデータを表すサンプルデータセットを使って、複雑なデータ構造からどのように分析して貴重な洞察を抽出するかを学びました。

実践的な演習を通じて、ネストしたデータ構造を作成し、集合演算を行い、特定の基準に基づいてデータを集約する実際の経験を得ました。この知識は、宇宙レーシング安全担当官としての役割において非常に貴重であり、レースコースを効果的に監視し、潜在的な危険を特定し、宇宙レースの公正と信頼性を確保することができます。

全体として、この実験は Hive のコレクション操作関数の包括的な紹介を提供し、Hadoop エコシステムで大規模なデータセットを効率的に分析および処理するための必要なスキルを身に付けさせました。