ハイブ多次元統計分析ケース実際の戦闘

目次

0要件の説明

1つのデータ構造

2準備

2.1準備表

2.2TEZ計算エンジンをインストールする

3ビジネス分析

3.1トップ10のビデオビューのカウント

3.2統計ビデオカテゴリの人気トップ10

3.3動画の視聴回数が最も多い20本の動画のカテゴリと、上位20本の動画を含むカテゴリの数を数えます

3.4ビデオ視聴回数のカウントとTop50関連ビデオのカテゴリによる並べ替え

3.5各カテゴリで人気のある動画のトップ10を数え、例として音楽を取り上げます

3.6各カテゴリの上位10本の動画再生回数を数える

3.7最も多くの動画をアップロードした上位10人のユーザーと、アップロードした上位20人の動画を動画の視聴回数で数えます


0要件の説明

iQiyiビデオウェブサイトの通常の指標に関する統計、さまざまなTopN指標:(多次元分析

-動画の視聴回数トップ10を数える

-統計ビデオカテゴリの人気トップ10

動画視聴数の上位20本の動画の統計-カテゴリカテゴリ数には上位20本の動画が含まれています

-動画の視聴回数でTop50に関連付けられている動画のカテゴリと種類数えます

-各カテゴリ人気のある動画のトップ10を数え、例として音楽を取り上げます

-各カテゴリの上位10本の動画再生回数をカウントします

-最も多くの動画をアップロードした上位10人のユーザーと、アップロードした上位20人の動画を動画の視聴回数でカウントします

1つのデータ構造

(1 )ビデオテーブル

ビデオテーブル

フィールド

備考

詳細な説明

videoId

動画の一意のID 文字列

11桁の文字列

アップローダー

ビデオアップローダー(文字列

アップロードされたビデオ文字列のユーザー名

年齢

ビデオ時代(int

プラットフォーム上のビデオの整数日

カテゴリー

ビデオカテゴリ(Array <String>

ビデオの指定されたビデオカテゴリをアップロードします

長さ

ビデオの長さ(Int

デジタル署名のビデオの長さを変更します

ビュー

ビュー(Int

ビデオが視聴された回数

割合

ビデオレーティング(ダブル

うち5ポイント

評価

フロー(Int

ビデオトラフィック、整数

コメント

コメント数(Int

動画のコメントの整数

relatedId

関連する動画ID Array <String>

上記のIDのビデオ、最大20 Ge

(2)ユーザーテーブル

ユーザーテーブル

フィールド

備考

フィールドタイプ

アップローダー

アップローダーのユーザー名

ストリング

ビデオ

アップロードされた動画の数

int

友達

友達の数

int

2準備

2.1準備表

(1)作成が必要なテーブル

元のデータテーブルを作成します:gulivideo_ori、gulivideo_user_ori、

ファイナルテーブルを作成します:gulivideo_orc、gulivideo_user_orc

(2 元のデータテーブルを作成します


    1)gulivideo_ori


create table gulivideo_ori(

    videoId string,

    uploader string,

    age int,

    category array<string>,

    length int,

    views int,

    rate float,

    ratings int,

    comments int,

    relatedId array<string>)

row format delimited fields terminated by "\t"

collection items terminated by "&"

stored as textfile;

2)元のデータテーブルを作成します:gulivideo_user_ori

create table gulivideo_user_ori(

    uploader string,

    videos int,

    friends int)

row format delimited

fields terminated by "\t"

stored as textfile;

(3)orcストレージ形式でスナップ圧縮を使用してテーブル作成します。

(1)gulivideo_orc

create table gulivideo_orc(

    videoId string,

    uploader string,

    age int,

    category array<string>,

    length int,

    views int,

    rate float,

    ratings int,

    comments int,

    relatedId array<string>)

stored as orc

tblproperties("orc.compress"="SNAPPY");

(2)gulivideo_user_orc

create table gulivideo_user_orc(

    uploader string,

    videos int,

    friends int)

row format delimited

fields terminated by "\t"

stored as orc

tblproperties("orc.compress"="SNAPPY");

(3)oriテーブルにデータを挿入します

load data local inpath "/opt/module/data/video" into table gulivideo_ori;

load data local inpath "/opt/module/user" into table gulivideo_user_ori;

(4)orcテーブルにデータを挿入します

insert into table gulivideo_orc select * from gulivideo_ori;

insert into table gulivideo_user_orc select * from gulivideo_user_ori;

2.2TEZ計算エンジンをインストールする

Tezは、MRよりも優れたパフォーマンスを備えたHiveの実行中のエンジンです。なぜMRよりも優れているのですか?見てください。

https://images2015.cnblogs.com/blog/16956/201603/16956-20160327150439042-1656855042.jpg

Hiveを使用してMRプログラムを直接記述します。4つの依存するMRジョブがあると想定します。上の図では、緑色はタスクの削減であり、クラウドは書き込みシールドを示しています。中間結果は永続的にHDFSに書き込む必要があります。

Tezは複数の依存ジョブを1つのジョブに変換できるため、HDFSを1回書き込むだけで済み、中間ノードが少なくなり、ジョブのコンピューティングパフォーマンスが大幅に向上します。

1 )tezインストールパッケージをクラスターにコピーし、tarパッケージを解凍します

[root@hadoop102 software]$ mkdir /opt/module/tez

[root@hadoop102 software]$ tar -zxvf /opt/software/tez-0.10.1-SNAPSHOT-minimal.tar.gz -C /opt/module/tez

2 )tez依存関係をHDFSにアップロードします

[root@hadoop102 software]$ hadoop fs -mkdir /tez

[root@hadoop102 software]$ hadoop fs -put /opt/software/tez-0.10.1-SNAPSHOT.tar.gz /tez

3 新しいtez-site.xmlを作成します

[root@hadoop102 software]$ vim $HADOOP_HOME/etc/hadoop/tez-site.xml

次のコンテンツを追加します。

<?xml version="1.0" encoding="UTF-8"?>

<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

<configuration>

<property>

    <name>tez.lib.uris</name>

    <value>${fs.defaultFS}/tez/tez-0.10.1-SNAPSHOT.tar.gz</value>

</property>

<property>

     <name>tez.use.cluster.hadoop-libs</name>

     <value>true</value>

</property>

<property>

     <name>tez.am.resource.memory.mb</name>

     <value>1024</value>

</property>

<property>

     <name>tez.am.resource.cpu.vcores</name>

     <value>1</value>

</property>

<property>

     <name>tez.container.max.java.heap.fraction</name>

     <value>0.4</value>

</property>

<property>

     <name>tez.task.resource.memory.mb</name>

     <value>1024</value>

</property>

<property>

     <name>tez.task.resource.cpu.vcores</name>

     <value>1</value>

</property>

</configuration>

4 Hadoop環境変数を変更します

 [root@hadoop102 software]$ vim $HADOOP_HOME/etc/hadoop/shellprofile.d/tez.sh

TezのJarパッケージ関連情報を追加する

hadoop_add_profile tez

function _tez_hadoop_classpath

{

    hadoop_add_classpath "$HADOOP_HOME/etc/hadoop" after

    hadoop_add_classpath "/opt/module/tez/*" after

    hadoop_add_classpath "/opt/module/tez/lib/*" after

}

5 Hiveの計算エンジンを変更します

[root@hadoop102 software]$ vim $HIVE_HOME/conf/hive-site.xml

追加

<property>

    <name>hive.execution.engine</name>

    <value>tez</value>

</property>

<property>

    <name>hive.tez.container.size</name>

    <value>1024</value>

</property>

6 )ログの解決ジャーパッケージの競合を

[root@hadoop102 software]$ rm /opt/module/tez/lib/slf4j-log4j12-1.7.10.jar

 

3ビジネス分析

3.1トップ10のビデオビューのカウント

アイデア:order byを使用して、ビューフィールドに従ってグローバルソートを実行し、最初の10個のアイテムのみを表示するように設定します。

最終コード:

SELECT

     videoId,

     views

FROM

     gulivideo_orc

ORDER BY

     views DESC

LIMIT 10;

3.2統計ビデオカテゴリの人気トップ10

アイデア:

  • (1)つまり、各カテゴリの動画の数を数え、最も多くの動画を含む上位10のカテゴリを表示します。
  • (2)group byのカテゴリに従って集計し、グループ内のvideoIdの数をカウントする必要があります。
  • (3)現在のテーブル構造は次のとおりです。1つのビデオが1つ以上のカテゴリに対応します。したがって、カテゴリ別にグループ化する場合は、最初にカテゴリを行に変換(展開)してから、カウントする必要があります。
  • (4)最後に人気順に並べ替え、上位10項目を表示します。

最終コード:

SELECT

    t1.category_name ,

    COUNT(t1.videoId) hot

FROM

(

SELECT

    videoId,

    category_name

FROM

    gulivideo_orc

lateral VIEW explode(category) gulivideo_orc_tmp AS category_name

) t1

GROUP BY

    t1.category_name

ORDER BY

    hot

DESC

LIMIT 10

3.3動画の視聴回数が最も多い20本の動画のカテゴリと、上位20本の動画を含むカテゴリの数を数えます

アイデア:

  • (1)まず、視聴回数が最も多い20本の動画に属するエントリのすべての情報を見つけ、降順で並べ替えます。
  • (2)これらの20個の情報のカテゴリを分割します(列から行へ)
  • (3)最後に、ビデオカテゴリの名前と、そのカテゴリの下にあるTop20ビデオの数をクエリします。

最終コード:

SELECT

    t2.category_name,

    COUNT(t2.videoId) video_sum

FROM

(

SELECT

    t1.videoId,

    category_name

FROM

(

SELECT

    videoId,

    views ,

    category

FROM

    gulivideo_orc

ORDER BY

    views

DESC

LIMIT 20

) t1

lateral VIEW explode(t1.category) t1_tmp AS category_name

) t2

GROUP BY t2.category_name

3.4ビデオ視聴回数のカウントとTop50関連ビデオのカテゴリによる並べ替え

コード:

SELECT

   t6.category_name,

   t6.video_sum,

   rank() over(ORDER BY t6.video_sum DESC ) rk

FROM

(

SELECT

   t5.category_name,

   COUNT(t5.relatedid_id) video_sum

FROM

(

SELECT

  t4.relatedid_id,

  category_name

FROM

(

SELECT

  t2.relatedid_id ,

  t3.category

FROM

(

SELECT

   relatedid_id

FROM

(

SELECT

   videoId,

   views,

   relatedid

FROM

   gulivideo_orc

ORDER BY

   views

DESC

LIMIT 50

)t1

lateral VIEW explode(t1.relatedid) t1_tmp AS relatedid_id

)t2

JOIN

   gulivideo_orc t3

ON

 t2.relatedid_id = t3.videoId

) t4

lateral VIEW explode(t4.category) t4_tmp AS category_name

) t5

GROUP BY

  t5.category_name

ORDER BY

  video_sum

DESC

) t6

3.5各カテゴリで人気のある動画のトップ10を数え、例として音楽を取り上げます

アイデア:

  • (1)音楽カテゴリでトップ10のビデオ人気をカウントする場合は、最初に音楽カテゴリを見つけてから、カテゴリを展開する必要があります。これにより、categoryIdの展開されたデータを格納するテーブルを作成できます。
  • (2)カテゴリ別に展開されたテーブルにデータを挿入します。
  • (3)対応するカテゴリ(音楽)の動画の人気を数えます。

音楽カテゴリのトップ10を数えます(他の人も数えることができます)

SELECT

    t1.videoId,

    t1.views,

    t1.category_name

FROM

(

SELECT

    videoId,

    views,

    category_name

FROM gulivideo_orc

lateral VIEW explode(category) gulivideo_orc_tmp AS category_name

)t1   

WHERE

    t1.category_name = "Music"

ORDER BY

    t1.views

DESC

LIMIT 10

3.6各カテゴリの上位10本の動画再生回数を数える

最終コード:

SELECT

  t2.videoId,

  t2.views,

  t2.category_name,

  t2.rk

FROM

(

SELECT

   t1.videoId,

   t1.views,

   t1.category_name,

   rank() over(PARTITION BY t1.category_name ORDER BY t1.views DESC ) rk

FROM   

(

SELECT

    videoId,

    views,

    category_name

FROM gulivideo_orc

lateral VIEW explode(category) gulivideo_orc_tmp AS category_name

)t1

)t2

WHERE t2.rk <=10

3.7最も多くの動画をアップロードした上位10人のユーザーと、アップロードした上位20人の動画を動画の視聴回数で数えます

アイデア:

  • (1)最も多くの動画をアップロードした10人のユーザーを見つける
  • (2)gulivideo_orcテーブルを関連付け、これらの10人のユーザーによってアップロードされたすべての動画を検索し、再生回数に応じて上位20件を取得します

最終コード:

SELECT

   t2.videoId,

   t2.views,

   t2.uploader

FROM

(

SELECT

   uploader,

   videos

FROM gulivideo_user_orc

ORDER BY

   videos

DESC

LIMIT 10   

) t1

JOIN gulivideo_orc t2

ON t1.uploader = t2.uploader

ORDER BY

  t2.views

DESC

 

おすすめ

転載: blog.csdn.net/godlovedaniel/article/details/110770648