目次
3.3動画の視聴回数が最も多い20本の動画のカテゴリと、上位20本の動画を含むカテゴリの数を数えます
3.4ビデオ視聴回数のカウントとTop50関連ビデオのカテゴリによる並べ替え
3.5各カテゴリで人気のある動画のトップ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よりも優れているのですか?見てください。
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