Spark大數據分析實務 課件 項目4 基于Spark SQL實現廣告流量檢測數據探索分析_第1頁
Spark大數據分析實務 課件 項目4 基于Spark SQL實現廣告流量檢測數據探索分析_第2頁
Spark大數據分析實務 課件 項目4 基于Spark SQL實現廣告流量檢測數據探索分析_第3頁
Spark大數據分析實務 課件 項目4 基于Spark SQL實現廣告流量檢測數據探索分析_第4頁
Spark大數據分析實務 課件 項目4 基于Spark SQL實現廣告流量檢測數據探索分析_第5頁
已閱讀5頁,還剩103頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

基于SparkSQL實現廣告流量檢測數據探索分析知識準備教學目標知識目標了解SparkSQL框架的功能及運行過程。了解SparkSQL與Shell交互。掌握SparkSQL的可編程數據模型DataFrame的創建、查詢等操作方法。教學目標技能目標能夠配置SparkSQLCLI,提供SparkSQL與Shell交互環境。能夠通過不同數據源創建DataFrame。能夠實現DataFrame數據及行列表的查詢操作。教學目標素質目標具備鉆研刻苦的精神,通過學習SparkSQLCLI,能夠獨立完成配置SparkonHive環境。具備獨立思考的學習能力,通過學習編程數據模型DataFrame,掌握多種方式創建DataFrame。具備良好的創新能力,通過學習DataFrame的查詢操作,掌握探索廣告流量檢測數據的分析能力。思維導圖項目背景數據探索分析可通過對數據的整理、清洗、可視化和統計分析等手段,發現數據中的模式、趨勢和關聯性,從而幫助人們理解數據背后的信息和規律,為決策提供支持和指導。為建設更高水平的平安中國,需堅持以網絡安全為基礎等內容的新安全格局,強化國家戰略科技力量,保障新發展格局。廣告數據監測公司希望通過SparkSQL技術實現廣告流量檢測數據探索分析,主要從數據記錄數、數據缺失值和字段特征進行探索,了解廣告流量檢測數據的整體情況與大體質量,為后續數據預處理提供處理憑證,并且為數據挖掘分析結論有效性和準確性奠定基礎。項目目標根據存儲在Hive中的廣告流量檢測數據,使用SparkSQL中的SQL函數進行讀取、查詢、探索分析廣告流量檢測數據。目標分析讀取Hive中的表并創建DataFrame對象。簡單查詢DataFrame數據,簡單分析廣告流量檢測數據的記錄數及缺失值等情況。利用分組查詢函數,探索分析廣告流量檢測數據中的日流量特征。利用排序查詢函數,探索分析廣告流量檢測數據中的IP地址的訪問次數特征。利用分組查詢函數,探索分析廣告流量檢測數據中違規流量數據特征。認識SparkSQL框架創建DataFrame對象查看DataFrame數據掌握DataFrame行列表查詢操作認識SparkSQL框架SparkSQL在Spark內核(Core)基礎上提供了對結構化數據的處理。所謂結構化數據,就是每條記錄共用的已知的字段集合。當數據符合條件時,SparkSOL就會針對數據的讀取和查詢變得更加簡單高效。SparkSQL簡介SparkSQL是一個用于處理結構化數據的框架,可被視為一個分布式的SQL查詢引擎,提供了一個抽象的可編程數據模型DataFrame。SparkSQL框架的前身是Shark框架,由于Shark需要依賴于Hive而制約了Spark各個組件的相互集成,所以Spark團隊提出了SparkSQL項目。SparkSQL借鑒了Shark的優點同時擺脫了對Hive的依賴性。相對于Shark,SparkSQL在數據兼容、性能優化、組件擴展等方面更有優勢。SparkSQL簡介SparkSQL提供了以下三大功能,如下。SparkSQL簡介具體來說,SparkSQL提供了以下三大功能,如下。SparkSQL可以從各種結構化數據源(如JSON、Hive、Parquet等)中讀取數據。SparkSQL不僅支持通過spark-shell在Spark程序內使用SQL語句進行數據查詢,也支持類似商業智能軟件Tableau外部工具、應用程序等通過標準數據庫連接器(JDBC/ODBC)連接SparkSQL進行查詢。當在Spark程序內使用SparkSQL時,SparkSQL支持SQL與常規的Python/Java/Scala代碼高度整合,包括連接RDD與SQL表、公開的自定義SQL函數接口等。SparkSQL簡介為了實現以上的功能,SparkSQL提供了一種特殊的RDD,叫作SchemaRDD。SchemaRDD是存放Row對象的RDD,每個Row對象代表一行記錄。SchemaRDD還包含記錄的結構信息(即數據字段)。SchemaRDD看起來和普通的RDD很像,但是在內部,SchemaRDD可以利用結構信息更加高效地存儲數據。SparkSQL簡介此外,SchemaRDD還支持RDD上所沒有的一些新操作,如運行SQL查詢。SchemaRDD可以從外部數據源創建,也可以從查詢結果或普通RDD中創建。從Spark1.3.0版本開始,SchemaRDD更名為DataFrame。SparkSQL簡介SparkSQL的運行過程如圖所示。SparkSQL簡介DataFrame是一個分布式的Row對象的數據集合,該數據集合提供了由列組成的詳細模式信息,并且DataFrame實現了RDD的絕大多數功能。SparkSQL通過SQLContext或HiveContext對象提供的方法可從外部數據源如Parquent文件、JSON文件、RDDs、Hive表等加載數據創建DataFrame。再通過DataFrame提供的API接口、DSL(領域特定語言)、spark-sql、spark-shell或ThriftJDBC/ODBCserver等方式對DataFrame數據進行查詢、轉換的操作,并將結果進行展現或使用save()、saveAsTable()方法將結果存儲為不同格式的文件。配置SparkSQLCLIApacheHive是Hadoop上的SQL引擎,SparkSOL編譯時可以包含Hive支持,也可以不包含。包含Hive支持的SparkSOL可以支持Hive表訪問、UDF(用戶自定義函數)、SerDe(序列化格式和反序列化格式),以及Hive查詢語言。從Spark1.1版本開始,Spark增加了SparkSQLCLI和ThriftJDBC/ODBCserver功能,使得Hive的用戶與熟悉SQL語句的數據庫管理員更容易上手。配置SparkSQLCLI即使沒有部署好與Hive的交互,SparkSQL也可以運行。若使用SparkSQLCLI的方式訪問操作Hive表數據,則需要將SparkSQL連接至一個部署成功的Hive上。配置SparkSQLCLI的基本流程如圖所示。配置SparkSQLCLI配置SparkSQLCLI的具體步驟如下。復制hive-site.xml文件至Spark安裝目錄的conf目錄。將hive-site.xml復制至/usr/local/spark-3.2.1-bin-hadoop2.7/conf目錄下。配置MySQL驅動,在/usr/local/spark-3.2.1-bin-hadoop2.7/conf/spark-env.sh文件中配置MySQL驅動,使用的MySQL驅動包為mysql-connector-java-8.0.21.jar,具體操作如下。配置spark-env.sh文件。進入Spark安裝目錄的conf目錄,使用“vimspark-env.sh”命令打開spark-env.sh文件,在文件末尾添加MySQL驅動信息。配置SparkSQLCLI復制MySQL驅動包至Spark安裝目錄的jars目錄。將MySQL驅動包復制至Spark安裝目錄的jars目錄下。啟動相應的集群與服務。啟動Hadoop集群、啟動MySQL服務和Hive的元數據服務。修改日志級別。將conf目錄下的perties.template文件復制并重命名為perties,執行命令“vimperties”打開perties文件,修改SparkSQL運行時的日志級別,將文件中“log4j.rootCategory”的值修改為“WARN,console”。配置SparkSQLCLI啟動Spark集群。切換至Spark安裝目錄的/sbin目錄,執行命令“./start-all.sh”啟動Spark集群。SparkSQL與Shell交互SparkSQL框架其實已經集成在spark-shell中,因此,啟動spark-shell即可使用SparkSQL的Shell交互接口。SparkSQL查詢數據時可以使用兩個對象,即SQLContext和HiveContext,從Spark2.x版本開始,Spark將SQLContext和HiveContext進行整合,提供一種全新的編程接口——SparkSession。SparkSQL與Shell交互SparkSession也稱為上下文,是與SparkSQL交互的主要入口點,用于處理與SQL相關的任務。SparkSession封裝了之前版本的SparkConf、SparkContext和SQLContext,提供了許多方便的方法來簡化Spark編程。而SparkContext是SparkCore的上下文,是整個Spark應用程序的基礎,負責與集群管理器通信以及執行RDD操作。SparkSQL與Shell交互如果在spark-shell中執行SQL語句,那么需要使用SparkSession對象調用sql()方法。在spark-shell啟動的過程中會初始化SparkSession對象為spark,此時初始化的spark對象既支持SQL語法解析器,也支持HQL語法解析器,也就是使用spark可以執行SQL語句和HQL語句。SparkSQL與Shell交互讀者也可以自己聲明SQLContext對象,創建SQLContext對象。但通過SQLContext創建的對象只能執行SQL語句,不能執行HQL語句。使用HiveContext之前首先需要確認使用的Spark版本是支持Hive的,并且已配置SparkSQLCLI。與使用SQLContext一樣,使用HiveContext之前可以先創建一個HiveContext對象。認識SparkSQL框架創建DataFrame對象查看DataFrame數據掌握DataFrame行列表查詢操作創建DataFrame對象DataFrame對象可以通過結構化數據文件、外部數據庫、Spark計算過程中生成的RDD、Hive中的表等數據源進行創建。雖然數據源存在多種,但創建DataFrame對象的流程是類似的,學習過程中要以辯證的思維看待問題,學會辯證統一,才能真正掌握創建DataFrame對象的方法。結構化數據源創建DataFrame一般情況下,結構化數據文件存儲在HDFS中,較為常見的結構化數據文件格式是Parquet格式或JSON格式。通過結構化數據源創建DataFrame的方法如下。通過Parquet格式文件創建DataFrame。SparkSQL可以通過load()方法將HDFS上的結構化數據文件轉換為DataFrame,load()方法默認導入的文件格式是Parquet。通過Parquet格式文件創建DataFrame的基本流程如下。將Parquret文件上傳至HDFS。將/usr/local/spark-3.2.1-bin-hadoop2.7/examples/src/main/resources/目錄下的users.parquret文件上傳至HDFS的/user/root/SparkSQL目錄下。結構化數據源創建DataFrame加載Parquet文件創建DataFrame。在spark-shell界面中,加載HDFS上的users.parquet文件數據并轉換為DataFrame。從運行結果中可以看出,dfParquet存在name、favorite_color等3個字段。結構化數據源創建DataFrame通過JSON格式文件創建DataFrame。若加載JSON格式的文件數據轉換為DataFrame,則還需要使用format()方法。通過JSON格式文件創建DataFrame的基本流程如下。將Json文件上傳至HDFS。將/usr/local/spark-3.2.1-bin-hadoop2.7/examples/src/main/resources/目錄下的employees.json文件上傳至HDFS的/user/root/SparkSQL目錄下。結構化數據源創建DataFrame加載JSON文件創建DataFrame。在spark-shell界面中,使用format()方法和load()方法加載HDFS上的employees.json文件數據并轉換為DataFrame。從如圖所示的運行結果中可以看出,dfJson存在name、salary兩個字段。外部數據庫創建DataFrameSparkSQL可以讀取關系型數據庫中的數據并使用SQL查詢。首先需要將關系型數據庫表加載成DataFrame,然后DataFrame注冊成視圖使用SQL查詢。以MySQL數據庫的表數據為例,將MySQL數據庫test中的student表的數據,讀者需要將“user”“password”對應的值修改為實際進入MySQL數據庫時的賬戶名稱和密碼。RDD創建DataFrameSparkSQL也可以對普通RDD的數據使用SQL查詢。RDD是彈性分布式數據集,是Spark核心底層操作的數據類型,Spark批處理底層操作的數據類型就是RDD。RDD數據轉為DataFrame有兩種方式。RDD創建DataFrame第一種方式是利用反射機制推斷RDD模式,再創建DataFrame,基本流程如圖所示。RDD創建DataFrame利用反射機制推斷RDD模式,再創建DataFrame,步驟如下。將/usr/local/spark-3.2.1-bin-hadoop2.7/examples/src/main/resources/目錄下的people.txt文件上傳至HDFS的/user/root/SparkSQL目錄下。讀取HDFS上的people.txt文件。加載成String類型的RDD。自定義Person樣例類。將得到的String類型的RDD轉換成Person類型的RDD。將Person類型的RDD通過隱式轉換函數轉換成DataFrame。RDD創建DataFrame第二種方式是采用編程指定Schema的方式,通過動態創建Schema的方式將RDD轉換成DataFrame,基本流程如圖所示。通過動態創建Schema的方式將RDD轉換成DataFrame,步驟如下。將HDFS上的people.txt文件轉換為String類型的RDD。將String類型的RDD轉換成Row類型的RDD。創建列的Schema信息。將Row類型的RDD根據列的Schema信息映射為DataFrame。Hive中的表創建DataFrame使用SparkSession對象并調用sql()方法查詢Hive中的表數據并轉換成DataFrame,查詢weather數據庫中的weather_in表數據并轉換成DataFrame,創建結果如圖所示。認識SparkSQL框架創建DataFrame對象查看DataFrame數據掌握DataFrame行列表查詢操作查看DataFrame數據DataFrame派生于RDD,因此類似于RDD,DataFrame只有在提交Action操作時才進行計算。DataFrame查看及獲取數據常用的函數或方法如表所示。函數或方法描述printSchema()打印數據模式show()查看數據first()/head()/take()/takeAsList()獲取collect()/collectAsList()獲取所有數據查看DataFrame數據將/usr/local/spark-3.2.1-bin-hadoop2.7/examples/src/main/resources/目錄下的people.txt文件上傳至HDFS的/user/root/SparkSQL目錄下。堅持在發展中保障和改善民生,鼓勵共同奮斗創造美好生活,不斷實現人民對美好生活的向往。隨著人們生活質量的提高,人們開始注重享受美好生活,其中逛街、看電影等成為常見的選擇。查看DataFrame數據現有一份用戶對電影評分的數據ratings.csv和電影數據movie.csv,字段說明如表所示。為了更好地滿足人們對電影的需求,需要對上述兩份電影數據進行分析,幫助了解用戶對電影的興趣和喜好。數據文件字段名說明movie.csvmovieId電影IDtitle電影名稱Genres電影類型ratings.csvuserId用戶IDmovieId電影IDrating用戶對電影的評分timestamp時間戳查看DataFrame數據將兩份數據上傳至HDFS,加載movie.csv數據創建DataFrame對象movies,加載ratings.csv數據創建DataFrame對象ratings。通過查看DataFrame數據,可以了解數據的屬性及數據的格式。創建DataFrame對象后,可以去查看DataFrame數據的模式。使用printSchema函數可以查看DataFrame數據模式,打印出列的名稱和類型。printSchema():打印數據模式查看DataFrame對象ratings的數據模式,查看結果。將/usr/local/spark-3.2.1-bin-hadoop2.7/examples/src/main/resources/目錄下的people.txt文件上傳至HDFS的/user/root/SparkSQL目錄下。show():查看數據使用show()方法可以查看DataFrame數據,可輸入的參數及結果說明。方法 說明show()顯示前20條記錄show(numRows:Int)顯示numRows條記錄show(truncate:Boolean)是否最多只顯示20個字符,默認為trueshow(numRows:Int,truncate:Boolean)顯示numRows條記錄并設置過長字符串的顯示格式show():查看數據使用show()方法查看DataFrame對象ratings中的數據,show()方法與show(true)方法查詢的結果一樣,只顯示前20條記錄,最多只顯示20個字符。查看結果。創建DataFrame對象show()方法默認只顯示前20行記錄。若需要查看前n行記錄則可以使用show(numRows:Int)方法,如通過“ratings.show(5)”命令查看對象ratings的前5行記錄。first()/head()/take()/takeAsList():獲取若干行記錄獲取DataFrame若干行記錄除了使用show()方法之外,還可以使用first()、head()、take()、takeAsList()方法,DataFrame獲取若干行記錄的方法解釋說明。方法 說明first()獲取第一行記錄head(n:Int)獲取前n行記錄take(n:Int)獲取前n行記錄takeAsList(n:Int)獲取前n行數據,并以List的形式展現first()/head()/take()/takeAsList():獲取若干行記錄分別使用first()、head()、take()、takeAsList()方法查看對象ratings前幾行數據記錄。first()和head()方法的功能相同,以Row或Array[Row]的形式返回一行或多行數據。take()和takeAsList()方法則會將獲得的數據返回驅動程序,為避免驅動程序發生內存溢出錯誤(OutofMemoryError),數據量比較大時不建議使用。first()/head()/take()/takeAsList():獲取若干行記錄collect()方法可以查詢DataFrame中所有的數據,并返回一個Array對象,collectAsList()方法和collect()方法類似,可以查詢DataFrame中所有的數據,但是返回的是List對象。分別使用collect()和collectAsList()方法即可查看ratings所有數據。認識SparkSQL框架創建DataFrame對象查看DataFrame數據掌握DataFrame行列表查詢操作掌握DataFrame行列表查詢操作DataFrame查詢數據有兩種方法,第一種是將DataFrame注冊成為臨時表,再通過SQL語句查詢數據。在代碼414中已創建了DataFrame對象dfPerson,將dfPerson注冊成臨時表,使用spark.sql()方法查詢dfPerson中年齡大于20的用戶,如代碼所示,查詢結果如圖所示。掌握DataFrame行列表查詢操作第二種方法是直接在DataFrame對象上進行查詢。DataFrame提供了很多查詢數據的方法,類似于SparkRDD的轉換操作,DataFrame的查詢操作是一個懶操作,即運行后僅僅生成一個查詢計劃,只有觸發執行操作才會進行計算并返回結果。DataFrame常用的查詢方法如表所示。方法描述where()/filter()條件查詢select()/selectExpr()/col()/apply()查詢指定字段的數據信息limit(n)查詢前n行記錄orderby()/sort()排序查詢groupBy()分組查詢join()聯合表查詢where():查詢符合指定條件的數據DataFrame可以使用where(conditionExpr:string)方法查詢符合指定條件的數據,參數中可以使用and或or。where()方法的返回結果仍然為DataFrame類型。查詢ratings對象中電影ID為306且評分大于3的電影評分信息,使用show()方法顯示前3條查詢結果。filter():篩選符合條件的數據DataFrame還可以使用filter()方法篩選出符合條件的數據,filter()的使用方法和where()是一樣的。使用filter()方法查詢ratings對象中電影ID為306且評分大于3的電影評分信息,查詢結果如圖所示,結果與圖所示的查詢結果一致。查詢指定字段的數據信息在生活中,做成一件事的方法不止一種,人生選擇的路也不止一條等著大家去發現。所謂條條大路通羅馬,完成目標的方法有很多,能有多一種方法的掌握,便能多一條“去羅馬的路”。指定的數據信息可以通過多種方法查詢,其中where()和filter()方法查詢的數據包含的是所有字段的信息,但是有時用戶只需要查詢某些字段的值即可。DataFrame提供了查詢指定字段的值的方法,如select()、selectExpr()、col()和apply()方法,用法介紹如下。select()方法:獲取指定字段值select()方法根據傳入的String類型字段名獲取指定字段的值,并返回一個DataFrame對象。查詢ratings對象中movieId和rating字段的數據,結果如圖所示。selectExpr()方法:對指定字段進行特殊處理在實際業務中,可能需要對某些字段進行特殊處理,如為某個字段取別名、對某個字段的數據進行四舍五入等。DataFrame提供了selectExpr()方法,可以對某個字段指定別名進行其他處理。使用selectExpr方法查詢ratings對象中movieId和rating字段信息,查詢結果如圖所示。col()/apply():獲取一個指定字段值col()和apply()方法也可以獲取DataFrame指定字段,但只能獲取一個字段,并且返回的是一個Column類型的對象。分別使用col()和apply()方法查詢user對象中zip字段的數據,查詢結果如圖所示。查詢指定行數的數據limit()方法可以獲取指定DataFrame數據的前n行記錄,不同于take()與head()方法,limit()方法不是Action操作,因此并不會直接返回查詢結果,需要結合show()方法或其他Action操作才可以顯示結果。使用limit()方法查詢ratings對象的前3行記錄,并使用show()方法顯示查詢結果,查詢結果如圖所示。排序查詢orderBy()方法是根據指定字段進行排序,默認為升序排序。若要求降序排序,orderBy()方法的參數可以使用desc("字段名稱")或$"字段名稱".desc,也可以在指定字段前面加“-”。使用orderBy()方法根據userId字段對ratings對象進行降序排序,查詢結果如圖所示。排序查詢sort()方法也可以根據指定字段對數據進行排序,用法與orderBy()方法一樣。使用sort()方法根據userId字段對ratings對象進行升序排序。分組查詢使用groupBy()方法可以根據指定字段進行分組操作。groupBy()方法的輸入參數既可以傳入String類型的字段名,也可以傳入Column類型的對象。使用groupBy()方法根據movieId字段對ratings對象進行分組。groupBy()方法返回的是一個GroupedData對象,GroupedData對象可調用的方法及解釋說明。方法描述max(colNames:String)獲取分組中指定字段或所有的數值類型字段的最大值min(colNames:String)獲取分組中指定字段或所有的數值類型字段的最小值mean(colNames:String)獲取分組中指定字段或所有的數值類型字段的平均值sum(colNames:String)獲取分組中指定字段或所有的數值類型字段的值的和count()獲取分組中的元素個數分組查詢表的方法都可以用在groupBy()方法之后。根據movieId字段對ratings對象進行分組,并計算分組中的元素個數,結果如圖所示。基于SparkSQL實現廣告流量檢測數據探索分析項目實施讀取數據創建DataFrame對象簡單查詢DataFrame數據分組查詢日流量特征排序查詢IP地址的訪問次數特征

探索違規流量數據特征讀取數據創建DataFrame對象要想對廣告流量檢測數據進行探索分析,需先通過SparkSQL讀取項目3保存到Hive中表的廣告流量檢測數據,并創建DataFrame。在知識準備中讀取Hive中的表創建DataFrame已經介紹了相關的配置步驟。Hive環境準備完成后,即可從Hive中讀取數據后創建DataFrame。讀取數據創建DataFrame對象簡單查詢DataFrame數據分組查詢日流量特征排序查詢IP地址的訪問次數特征

探索違規流量數據特征簡單查詢DataFrame數據基礎數據探索是數據挖掘的基礎工作。通過查詢數據記錄來了解流量檢測數據的數據量。查詢數據記錄數通過統計數據總記錄數及IP地址數量進行簡單的分析,探索7天流量數據的數據量。查詢數據總記錄數案例的數據是7天流量數據的數據量,第一步就是需要探索7天的數據量,查詢結構如圖所示。查詢數據記錄數統計IP地址的數量在廣告檢測流量數據中,字段ip記錄了流量數據提取的IP地址。通過統計IP地址數量,可得到ip字段的記錄數與7天的總記錄是否一致。統計IP地址的數量運行結果如圖所示,可知IP地址的記錄數與數據總記錄數一致,可得IP地址不存在缺失數據。簡單查詢DataFrame數據查詢數據缺失值數據質量分析是數據預處理的前提,也是數據挖掘分析結論有效性和準確性的基礎,主要任務是檢查原始數據中是否存在臟數據,臟數據一般是指不符合要求,以及不能直接進行分析的數據,包括缺失值、不一致值等。本節主要通過缺失數據及冗余數據分析廣告流量數據是否存在臟數據。對數據進行質量分析首先需考慮數據是否存在缺失情況,因此,對7天所有的廣告檢測中的流量數據進行缺失值探索,統計出各個屬性的缺失率,統計各個屬性的缺失結果如圖所示。查詢數據缺失值根據如圖所示的各屬性的缺失率繪制柱形圖,如圖所示,mac、creativeid、mobile_os、mobile_type、app_key_md5、app_name_md5、os_type、idfa、imei、android、openudid等屬性的缺失率非常高。尤其是creativeid屬性,高達98.39%,由于原始數據存在字符型數據,無法進行插補,后續編寫程序,對部分缺失過多的屬性進行刪除操作。查詢數據缺失值如果缺失值占數據集的較大比例,可能無法獲得全面和準確的數據視圖,從而影響分析結果的可靠性。缺失值的存在可能導致數據的不一致性,對數據進行觀察,其中idfa、imei、android、openudid四個字段都是用于識別手機系統類型的屬性,對后續建模存在較大的影響,四個字段的分析結果如表所示。在數據缺失的統計中,數據集中idfa、imei、android、openudid四個字段各自的缺失率是偏高的,若后續構建特征時需要使用識別手機系統類型的字段,可以將四個字段合并,以降低手機系統類型屬性缺失率,提取有效信息。屬性名稱缺失率備注idfa92.19%可用于識別iOS用戶imei79.83%可用于識別Android用戶android80.79%可用于識別Android用戶openudid84.14%可用于識別iOS用戶讀取數據創建DataFrame對象簡單查詢DataFrame數據分組查詢日流量特征排序查詢IP地址的訪問次數特征探索違規流量數據特征分組查詢日流量特征廣告檢測流量數據記錄總共有7天,通過字段dt記錄了流量數據提取的相對時間。字段的值為1~7,1表示提取的7天流量數據的第一天數據,以此類推。對每天的數據流量數進行統計,查看是否有異常現象。分組統計流量數據的運行結果如圖所示,可以看出數據的日流量差異不大,說明并沒有存在數據異常增加或減少的情況,數據產生的環境相對穩定。讀取數據創建DataFrame對象簡單查詢DataFrame數據分組查詢日流量特征排序查詢IP地址的訪問次數特征探索違規流量數據特征排序查詢IP地址的訪問次數特征在廣告檢測流量數據樣本數據中,每個記錄數都記錄了對應的IP地址,對點擊的IP進行一個簡單的統計,并根據統計數進行排序,查看IP是否存在異常。如圖結果所示,IP訪問次數中存在異常值,存在同一個IP高頻訪問廣告的情況,同時占據著很高的數據比例,在后續違規探索中需對ip字段進行一個估量。讀取數據創建DataFrame對象簡單查詢DataFrame數據分組查詢日流量特征排序查詢IP地址的訪問次數特征探索違規流量數據特征探索違規流量數據特征不同違規行為產生的數據特征不同,對虛假流量數據探索分析,將虛假流量根據違規行為進行劃分,為構建特征指標提供保障。虛假流量根據違規行為劃分如下:腳本刷新網頁違規定期清除Cookie,刷新網頁違規ADSL重新撥號后刷新網頁違規腳本刷新網頁違規腳本刷新網頁違規是通過設定程序,使電腦按一定的規則訪問目標網站。該違規方式產生的數據記錄中Cookie與IP不變,且存在多條記錄。例如,某用戶(IP為1,Cookie為646d9cd31ae2a674d1ed6d68acc6e019)在第1天利用同一瀏覽器(useragent:Mozilla)多次訪問某一網址(mediaid:151)上的廣告(placementid:e886beb3cc63365cf71e1ae19aae60ea)。經過統計,產生了1206條Cookie和IP不變的數據記錄,該用戶的行為屬于利用腳本刷新網頁的違規行為,所產生的流量數據為虛假流量。對Cookie和IP不變的數據記錄進行分組統計,探索Cookie和IP不變的數據記錄統計次數。腳本刷新網頁違規Cookie和IP相同的流量記錄數統計結果如圖所示,在7天的流量數據中,確實存在同一IP和Cookie高頻點擊廣告的情況。正常情況下極少會有人在7天內頻繁點擊某廣告多達100次或以上,因此在IP和Cookie不變的情況下,統計單擊頻數超過100次的IP和Cookie數。腳本刷新網頁違規單擊頻數超過1000次的IP和Cookie數統計結果如圖所示。7天中同一個IP和Cookie點擊廣告超過100的就有104個,將同一個IP和Cookie的對應記錄數相加,在流量記錄中占據很大比例,如果不加以識別,將會對廣告主造成很大損失。定期清除Cookie,刷新網頁違規同一IP和Cookie瀏覽數據很容易被識別出來,所以違規者往往也會通過定期清除Cookie,產生新的Cookie,制造不同Cookie的訪問記錄,使流量數據避免被廣告主識別為虛假流量,該類的虛假流量表現為IP不變,多條不同Cookie記錄。例如,某用戶(IP為92)的流量記錄有10000條,其中含有9000不同的Cookie,該用戶的流量數據是通過定期清除Cookie,刷新網頁產生的虛假流量。定期清除Cookie,刷新網頁違規根據IP進行分組統計,統計每個IP對應的不同Cookie次數的分布情況,如圖所示。每個IP對應的不同Cookie次數的分布情況如圖所示,存在同一個IP高頻訪問廣告的情況,同時占據著很高的數據比例,需要進行識別。ADSL重新撥號后刷新網頁違規違規者利用ADSL重新撥號后刷新網頁違規,在某一時間段里,多條訪問記錄的IP來源于同個區域,IP的前兩段或前三段相同,此類行為下產生的流量數據同樣為虛假流量。例如,前兩段為97.200的IP共20000條,其中前三段為97.200.183的IP有5000條,前三段為97.200.72的IP有15000條。區域辦公可能會導致用戶IP的前兩段或三段相同,但是上萬條的流量記錄超出了正常范圍,是違規者利用ADSL重新撥號后刷新網頁的違規行為。根據IP前兩段進行分組統計,統計IP前兩段相同的記錄數的分布情況。ADSL重新撥號后刷新網頁違規IP前兩段相同的記錄數的分布情況如圖所示,IP前兩段相同的流量記錄上萬的情況比較多,是屬于虛假流量數據。ADSL重新撥號后刷新網頁違規根據IP前三段進行分組統計,統計IP前三段相同的記錄數的分布情況。IP前三段相同的記錄數的分布情況如圖所示,IP前三段相同的流量記錄上萬的情況也較多,與IP前兩段相同一樣,如果對應的記錄過于龐大,那么定義為虛假流量數據。不同的違規行為產生的數據特征不同,對數據進行探索分析,合理歸納虛假流量的數據特征,為后期有針對性地對數據進行預處理,構建相應的指標提供可靠依據,可有效提高模型分類的準確率。項目總結本項目首先介紹了SparkSQL的功能及運行流程,并介紹了SparkSQLCLI的配置方法和SparkSQL與Sheel交互,接著介紹了SparkSQL的抽象的編程數據模型DataFrame,詳細介紹了從結構化數據源、外部數據庫、RDD及Hive中的表4種方式創建DataFrame對象,最后介紹了DataFrame數據的查看以及DataFrame的行列表查詢操作。基于知識點介紹,對廣告流量檢測數據創建DataFrame,通過DataFrame的查詢操作對廣告流量檢測數據進行基本數據查詢、缺失數據分析以及特征字段進行探索分析。通過本項目數據探索的結果,夠更好的開展后續的數據挖掘與數據建模工作。基于SparkSQL實現廣告流量檢測數據探索分析技能拓展+測試題技能拓展深度學習、勇于實踐是增強本領的重要途徑,通過多方面深度學習來不斷更新知識、更新技能,進而提高個人水平。DataFrame是一種以RDD為基礎的帶有Schema元信息的分布式數據集。RDD其實就是分布式的元素集合。在Spark中,對數據的所有操作不外乎創建RDD、轉化已有RDD以及調用RDD操作進行求值。而在背后中,Spark會自動將RDD中的數據分發到集群上,并將操作并行化執行。RDD的創建Spark提供了兩種創建RDD的方式:讀取外部數據集,以及在驅動器程序中對一個集合進行并行化。創建RDD最簡單的方式就是將程序中一個已有的集合傳給SparkContext的parallelize()方法,可以在Shell中快速創建出RDD,然后對RDD進行操作。不過,需要注意的是,除了開發原型和測試時,此方式用得并不多,原因是需要將整個數據集先放在一臺機器的內存中。RDD的操作RDD支持兩種操作:轉換操作和行動操作。RDD的轉化操作是返回一個新的RDD的操作,如map()和filter()方法,而行動操作則是向驅動器程序返回結果或將結果寫入外部系統的操作,會觸發實際的計算,如count()和first()方法。轉換操作RDD的轉換操作是返回新RDD的操作。轉換出來的RDD是惰性求值的,只有在行動操作中用到RDD時才會被計算。這樣的設計使得Spark可以更高效地執行計算任務,避免了不必要的計算和數據移動。假定篩選電影評論數據電影類型包含Comedy的電影,可以使用轉化操作filter()。RDD的操作行動操作行動操作是第二種類型的RDD操作,會將最終求得的結果返回到驅動器程序,或寫入外部存儲系統中。由于行動操作需要生成實際的輸出,會強制執行求值必須用到的RDD的轉化操作。如想輸出數據信息,需要使用兩個行動操作來實現,用count()來返回計數結果,用take()來收集RDD中的一些元素,其輸出結果如圖所示。知識測試(1)下列關于SparkSQL框架的描述錯誤的是()。A.SparkSQL可以從各種結構化數據源(如JSON、Hive、Parquet等)中讀取數據。B.SparkSQL提供了一種特殊的RDD,叫作DataFrame。C.SparkSQL不僅支持通過spark-shell在Spark程序內使用SQL語句進行數據查詢。D.SparkSQL是一個用于處理結構化數據的框架,可被視為一個分布式的SQL查詢引擎,提供了一個抽象的可編程數據模型RDD。(2)【多選題】下列關于DataFrame對象說法正確的是()。A.DataFrame可以通過結構化數據文件、外部數據庫、Spark計算過程中生成的RDD、Hive中的表等數據源進行創建B.加載JSON文件

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論