ビデオ・オーディオとビデオの心を持つハイブ戦闘_

要件の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。

おすすめ

転載: www.cnblogs.com/Hinine-zyx5852/p/11534718.html