要件の1説明 - 従来の統計的指標のビデオ映像のビデオサイト、各種の上位Nの指標:
ビデオデータの数は-1-トップ5と映像表示映像カテゴリの数の統計統計-2-ビュービデオTOP5 TOP5熱-3-カテゴリのカテゴリ統計は、ビデオTOP5を含ん
ビデオTOP5ランク分類(ソート)の数に関連付けられ-4-映像視聴統計-5各ビデオカテゴリTOP5ための熱-6- TOP5トラフィック統計情報の各映像カテゴリの統計
-7-ほとんどの統計ユーザーはTOP5とフロントビデオ-8-各カテゴリの統計情報の5の見解ビデオビューTOP5の数をアップロードした動画をアップロード
2.項目1)データ構造
(1)動画のテーブル
フィールド |
リマーク |
詳細な説明 |
VIDEO_ID |
ビデオの一意のID |
11の文字列 |
up_loader |
動画アップローダー |
ユーザー名の文字列は、動画をアップロード |
年齢 |
動画の年齢 |
整数当日のプラットフォーム上のビデオ |
カテゴリー |
動画カテゴリ |
ビデオ指定されたビデオの分類をアップロード |
長さ |
ビデオの長さ |
デジタルIDを形作るビデオの長さ |
景色 |
ビュー |
動画が閲覧された回数 |
割合 |
動画の評価 |
5のうち、 |
評価 |
フロー |
ビデオトラフィック、整数 |
conments |
レビュー |
コメントの整数の動画 |
関連のIDS |
関連動画ID |
最大20のidの動画 |
(2)ユーザテーブル
フィールド |
リマーク |
フィールドタイプ |
up_loader |
ユーザー名でアップロード |
弦 |
ビデオ |
動画の数は、アップロードされました |
int型 |
友人 |
友人の数 |
int型 |
2)ETL生データ
生データの形態を観察することにより、分割された各カテゴリアンパサンドと、ビデオカテゴリの複数が見出され得る、分割スペース文字の両側、ビデオはまた複数の要素を有することが可能であるが、ビデオの複数の「関連付けられた\ T「セグメンテーション。データ解析、我々最初のデータ組換え洗浄操作を操作データサブ要素が複数存在することを容易にするために。すなわち:「&」スプリットを持つすべてのカテゴリ、明確なスペース、関連動画IDを使用「&」セグメンテーションの複数を除去しながら。
-java処理データ -
ETLUtilの(1)ETL
パブリッククラスETLUtil {
公共の静的な文字列oriString2ETLString(文字列ORI){
StringBuilderのetlString =新しいStringBuilderの();
文字列[]スプリット= ori.split( "\ tの");
(splits.length <9)戻り場合はnull;
分割[3] =分割[3] .replace(」」、 "");
以下のために(INT i = 0; iはsplits.length <; iは++){
IF(iは9 <){
IF(I == splits.length - 1){
etlString.append(分割[I])。
}他{
etlString.append(分割[I] + "\ tの");
}
}他{
IF(I == splits.length - 1){
etlString.append(分割[I])。
}他{
etlString.append(分割[I] + "&");
}
}
}
)(etlString.toStringを返します。
}
}
(2)マッパーのETL(パッケージ:にIOException、のStringUtils、NullWritable、テキスト、マッパー、ETLUtil)
パブリッククラスVideoETLMapperはマッパーを拡張<オブジェクト、テキスト、NullWritable、テキスト> {
テキストテキスト=新しいテキスト();
@オーバーライド
保護されたボイドマップ(オブジェクトキー、テキスト値、コンテキスト・コンテキスト)はIOExceptionがスローされ、InterruptedExceptionあります{
ストリングetlString = ETLUtil.oriString2ETLString(value.toString())。
(StringUtils.isBlank(etlString))の復帰であれば、
text.set(etlString)。
context.write(NullWritable.get()、テキスト);
}
}
(3)のETL之ランナー(包:IOExceptionが、設定、ファイルシステム、パス、NullWritable、テキスト、仕事、FileInputFormat、FileOutputFormat、ツール、ToolRunner)
パブリッククラスVideoETLRunnerは{ツールを実装します
プライベートコンフィギュレーションのconf = NULL;
@オーバーライド
公共ボイドsetConf(設定CONF){
this.conf = CONF。
}
@オーバーライド
公共の構成getConf(){
this.conf返します。
}
@オーバーライド
公共int型のラン(文字列[] argsが){例外をスロー
CONF = this.getConf()。
conf.set( "INPATH"、引数[0])。
conf.set( "OUTPATH"、引数[1])。
ジョブジョブ= Job.getInstance(CONF)。
job.setJarByClass(VideoETLRunner.class)。
job.setMapperClass(VideoETLMapper.class)。
job.setMapOutputKeyClass(NullWritable.class)。
job.setMapOutputValueClass(Text.class)。
job.setNumReduceTasks(0)。
this.initJobInputPath(ジョブ);
this.initJobOutputPath(ジョブ);
job.waitForCompletion(true)を返しますか?0:1。
}
プライベート無効initJobOutputPath(ジョブジョブ)はIOExceptionがスロー{
設定CONF = job.getConfiguration();
ストリングoutPathString = conf.get( "OUTPATH")。
ファイルシステムFS = FileSystem.get(CONF)。
パスOUTPATH =新しいパス(outPathString)。
IF(fs.exists(OUTPATH)){
fs.delete(OUTPATH、真の);
}
FileOutputFormat.setOutputPath(ジョブ、OUTPATH)。
}
プライベート無効initJobInputPath(ジョブジョブ)はIOExceptionがスロー{
設定CONF = job.getConfiguration();
ストリングinPathString = conf.get( "INPATH")。
ファイルシステムFS = FileSystem.get(CONF)。
パスINPATH =新しいパス(inPathString)。
IF(fs.exists(INPATH)){
FileInputFormat.addInputPath(ジョブ、INPATH)。
}他{
新しいのRuntimeExceptionをスロー(「ディレクトリにあるHDFSファイルが存在しません:」+ inPathString)。
}
}
パブリック静的無効メイン(文字列[] args){
{試します
int型のresultCode = ToolRunner.run(新VideoETLRunner()、引数);
IF(結果コード== 0){
System.out.println( "成功!");
}他{
System.out.println( "失敗!");
}
System.exitと(のresultCode)。
}キャッチ(例外e){
e.printStackTrace();
System.exit(1)。
}
}
}
ETLの(4)の実装
[]#ビン/糸ジャー〜/ソフトウェア/瓶/ビデオ-0.0.1-SNAPSHOT.jarに/
com.atguigu.etl.ETLVideosRunner /
/ビデオ/ 2008/0222 /
/出力/映像/ 2008/0222
3.調製1)テーブルを作成します
video_oriを、video_user_oriテーブルを作成:テーブルを作成しvideo_orc、video_user_orc
(1)動画_
文字列up_loader、テーブルvideo_ori(VIDEO_ID文字列を作成し、年齢int型、
カテゴリ列<文字列>、長さはint、int型ビュー、レートフロート、評価はint、int型コメント、relatedId配列<文字列>)
「&」テキストファイルとして記憶することによって終了「\ T」コレクションアイテムによって終了行フォーマット区切られたフィールド。
(2)video_user_ori
テーブルvideo_user_oriを作成する(up_loader文字列、動画int型、友人はint型)
テキストファイルとして格納され、「\ tの」によって終了行フォーマット区切られたフィールド。
- 生データは、テーブルORCに挿入されています -
(3)video_orc。
文字列up_loader、テーブルvideo_orc(VIDEO_ID文字列を作成し、年齢int型、
カテゴリ列<文字列>、長さはint、int型ビュー、レートフロート、評価はint、int型コメント、relatedId配列<文字列>)
「&」ORCとして記憶することによって終了「\ T」コレクションアイテムによって終了行フォーマット区切られたフィールド。
(4)video_user_orc。
テーブルvideo_user_orcを作成する(up_loader文字列、動画int型、友人はint型)
ORCとして格納され、「\ tの」によって終了行フォーマット区切られたフィールド。
2)データのインポートETL
(1)ビデオ-ORI:負荷データINPATH "/ 2008/0222 /出力/ビデオ" テーブルvideo_oriにします。
(2)video_user_ori:負荷データINPATH "/ビデオ/ユーザ/ / 0903 2008" テーブルvideo_user_oriに。
3)データテーブルORCを挿入
(1)ビデオORC:video_ori SELECT * FROM video_orcテーブルに挿入します。
(2)video_user_orc:video_user_ori SELECT * FROM video_user_orcテーブルに挿入します。
4.ビジネス分析
-1-ビデオ視聴統計の数TOP5(アイディア:グローバルフィールドは、ビューを並べ替えることによって、順序を使用し、最初の5セット)
VIDEO_ID、上限5 DESCビューによってup_loader、年齢、ビューvideo_ori注文からを選択します。
統計カテゴリの熱TOP5ビデオ-2-(アイデア:グループで重合し、その後VIDEOIDカウント数に応じて、カテゴリ別にグループ、熱をソートによると、5以前を表示
現在のテーブル構造なので:ビデオは、1つまたは複数のカテゴリーに対応します。あなたがカテゴリ別にグループにしたいのであれば、あなたは)最初のカテゴリのカラムスイッチ(拡大)する必要があり、その後、カウントします
カテゴリとしてCATEGORY_NAMEを選択し、(VIDEO_IDを選択し、カテゴリ名からホット(t1.video_Id)をカウント
CATEGORY_NAMEとしてvideo_ori側面図から爆発(カテゴリ)t_catetory)のT1
ホットDESC制限5によってt1.category_name順によってグループ。
-3-動画カテゴリ数およびカテゴリを見るために上位5つのビデオの数の統計TOP5ビデオを含む(アイデアは:最初の降順で、20映像が所有するエントリの最大数を表示するには、すべての情報を見つけます
その後、)このうち20情報カテゴリ(カラムスイッチ)、およびクエリ映像の最後に数TOP5はビデオカテゴリ名の下にあり、カテゴリを分けます
(からhot_with_viewsとして(t2.video_Id)をカウント、カテゴリとしてカテゴリ名を選択
VIDEO_ID、(リミット5 DESCビューによってvideo_ori順序SELECT * FROM)からCATEGORY_NAME選択
hot_with_viewsによってCATEGORY_NAME順序によってCATEGORY_NAMEとしてT1横ビュー爆発(カテゴリ)t_catetory)をT2群DESC;
-4-ビデオ視聴統計の数TOP5関連するビデオカテゴリ分類(アイデアは:一時テーブルt1として記録したビデオの5つの最大数を見て前にすべての情報をチェックしてください(もちろん、各映像関連のビデオのための値が含まれています)、
一時テーブルT2と呼ばれるビデオスイッチrelatedIdカラム、およびビデオのカテゴリでグループ化された動作テーブルを、内部結合video_orcビデオのIDを見つける5関連する映像情報は、映像は)順位、各グループの数をカウントし、そして
T1テーブル:
上限5 DESCビューによってvideo_orc順序から*選択します。
t2のテーブル:
t1からVIDEOIDとして(relatedId)を爆発選択します。
T5テーブル:
(インナーt2はt2.video_Id = t3.video_Idにvideo_orcのT3への参加から(t2.video_Id)異なる、t3.categoryを選択)
T4横ビューはCATEGORY_NAMEとして(カテゴリ)t_catetoryを爆発します。
最后代码:
VIDEO_ID、カテゴリ名を選択(からホット(t5.video_Id)をカウントし、カテゴリとしてカテゴリ名を選択し
VIDEO_IDとして((relatedIdを爆発選択)からt3.category、()(t2.video_Idを明確な選択からを
(video_oriから選択*からビュー順DESCインナーt2.video_Id = t3.video_Id)にvideo_ori T3の参加T2)5)T1を制限T4横
ビューCATEGORY_NAMEとして(カテゴリ)t_catetory)ホットDESCによってCATEGORY_NAME順序によってT5基を爆発。
-5-ビデオ統計は、xy(アイデアで例えば、各カテゴリでTOP5を加熱:あなたがテーブルを作成できるようにTOP5 xyの統計ビデオカテゴリを加熱するために、我々はXYカテゴリを見つける必要がある、あなたは、カテゴリを展開する必要がありますカテゴリに拡張データを格納するための区分は、データを挿入する展開。カテゴリ(XY)ビデオの熱に対応する統計情報を表示します。)
1.创类别(展开)表:
CREATE TABLEのvideo_category(VIDEO_ID列、up_loader列、年齢INT、
区分文字列、長INT、ビューINT、速度フロート、評価INT、コメントINT、relatedId配列<ストリング>)
行形式区切られたフィールド「&」ORCとして格納することによって終了「\ tの」コレクションアイテムによって終了。
2.向类别表中插入数据:
VIDEO_ID、up_loader、年齢区分、長さ、ビュー、速度、選択video_categoryテーブルに挿入
評価、コメントを、relatedIdはvideo_ori側面図から区分として(カテゴリ)catetoryを爆発。
3.统计XY类别的TOP5(也可以统计其他)
; VIDEO_ID、video_categoryからリミット5 DESCビューによって区分は= "XY"順序ビューを選択
-6-各カテゴリTOP5ためのビデオトラフィックの統計情報は、DZするために、例えば(アイデア:ソート評価によると、区分コラムスイッチの後に(表)ビデオcategoriesExpandテーブルを作成します)
1.创类别(展开)表:
表video_ratingsを作成する(VIDEO_ID列、up_loader列、年齢INT、
区分文字列、長INT、ビューINT、速度フロート、評価INT、コメントINT、relatedId配列<ストリング>)
行形式区切られたフィールド「&」ORCとして格納することによって終了「\ tの」コレクションアイテムによって終了。
2.向类别表中插入数据:
VIDEO_ID、up_loader、年齢区分、長さ、選択テーブルvideo_ratings挿入
区分としてビュー、速度、評価、コメント、relatedId video_ori側面図から爆発(カテゴリ)catetoryと、
3.按照評価排序、以DZ为例
選択VIDEO_ID、ビュー、video_ratingsから評価場所評価DESC制限5によって区分は= "DZ"オーダー。
-7-ほとんどの統計ユーザーはTOP5とフロントビデオ(5つのアイデアの景色アップロードした動画をアップロード:得られた情報によると、video_orcテーブルup_loaderフィールドで参加し、ビデオは5人のユーザーのユーザー情報までアップロード最初の発見をビュービューは、並べ替えることができます。)
1.利用者の5つのユーザ情報までアップロード動画を見つけ
DESCのビデオによって制限video_user_oriオーダーからSELECT * 5;。
up_loaderによって実行2.取得したビュービューがソート情報によると、フィールドvideo_oriテーブルに参加
t2.video_Idを選択し、T2 (DESC制限によってビデオvideo_user_ori注文からSELECT * 5)から.views、t2.ratings、t1.videos、t1.friends T1
DESC制限順t2.up_loader t1.up_loader ON video_ori T2を=参加5つの図。
-8-各カテゴリ番号TOP5(アイデアのためのビデオ視聴統計:まず、テーブルデータ区分拡大し、サブクエリを取得する区分を分割し、その後、ソートを分割し、増分数、この列の名前ランク欄のインクリメント数を生成するには、サブクエリによって生成された一時テーブルは、クエリ値)は、データ線5の以下のランクであります
最終的なコード:
T1を選択します。*から(選択VIDEO_ID、区分、ビュー、
video_categoryからランク(ビューDESCによって区分順序によってパーティション)にわたるROW_NUMBER())のランク<= 10、T1。