[2.4]以row_number為例解讀spark sql的視窗函式
參考
場景
將本地檔案toNGroup.txt中的內容:
hadoop@master:~/resource$ cat toNGroup.txt
hadoop 29
hadoop 87
hadoop 39
hadoop 27
hadoop 88
spark 29
spark 90
spark 27
spark 84
spark 92
hadoop@master:~/resource$
按照第一個欄位分組,然後按照第二個欄位降序排序,取前4位。即正常結果如下顯示:
spark 92 spark 90 spark 84 spark 29 hadoop 88 hadoop 87 hadoop 39 hadoop 29
分析
- 將本地資料匯入到hive表中。spark SQL 通過HiveContext可以直接操作 hive倉庫表中的資料
- 通過視窗函式生成一個數字序列,取該序列的前4條資料即可
spark sql中提供了很多內建的函式,這個與mysql中內建的函式型別相似,大致分為:
Aggregate functions、Collection functions、Date time functions、Math functions、String functions、UDF functions以及Window functions - 具體內容可以參看[參考]中的相關連結。通過這些函式,資料分析人員可以很方便的對資料進行各種豐富的挖掘。本文主要以row_number函式實現分組排序為例子,體驗視窗函式的使用。row_number函式說明如下:
def row_number(): Column
Window function: returns a sequential number starting at 1 within a window partition.
嘿,分組、排序在各大電商網站的應用是有多常見啊!
實驗
package main.scala
import org.apache.spark.SparkConf
import org.apache.spark.SparkContext
import org.apache.spark.sql.hive.HiveContext
/**
* 視窗函式實戰
*
* 1、Spark可以通過HiveContext直接操作Hive中的資料,基於HiveContext我們可以使用sql/hql兩種方式編寫SQL語句對Hive
* 進行操作:建立、刪除表,往表中匯入資料,以及CRUD
* 2、通過saveAsTable方式把DataFrame中的資料儲存到Hive資料倉庫中
* 3、通過 HiveContext.table方式直接載入Hive中的表而生成DataFrame
*/
object SparkSQLWindowFunctionOps {
def main(args: Array[String]): Unit = {
val conf = new SparkConf().setAppName("SparkSQLWindowFunctionOps")
val sc = new SparkContext(conf)
val hiveContext = new HiveContext(sc)
hiveContext.sql("use hive")
hiveContext.sql("DROP TABLE IF EXISTS scores")
hiveContext.sql("CREATE TABLE IF NOT EXISTS scores(name STRING,score INT) ROW FORMAT DELIMITED FIELDS TERMINATED BY ' ' LINES TERMINATED BY '\\n'")
//把要處理的資料匯入到Hive表中
hiveContext.sql("LOAD DATA LOCAL INPATH '/home/hadoop/resource/toNGroup.txt' INTO TABLE scores" )
/*
* 使用自查詢完成目標資料的提取,在目標資料內使用視窗函式row_number來進行分組排序:
* PARTITION BY :指定視窗函式分組的Key
* ORDER BY :分組後進行排序
*/
val result = hiveContext.sql("SELECT name,score "
+ "FROM ("
+ "SELECT "
+ "name,"
+ "score, "
+ "row_number() OVER (PARTITION BY name ORDER BY score DESC ) rank"
+ " FROM scores"
+ ") sub_scores "
+ " WHERE rank <= 4")
result.show(); //在Driver的控制檯上打印出結果
hiveContext.sql("DROP TABLE IF EXISTS sortedResultScores")
result.saveAsTable("sortedResultScores")
}
}
執行結果
16/06/01 23:22:19 INFO DAGScheduler: ResultStage 3 (show at SparkSQLWindowFunctionOps.scala:46) finished in 6.969 s
16/06/01 23:22:19 INFO DAGScheduler: Job 1 finished: show at SparkSQLWindowFunctionOps.scala:46, took 7.284524 s
+------+-----+
| name|score|
+------+-----+
| spark| 92|
| spark| 90|
| spark| 84|
| spark| 29|
|hadoop| 88|
|hadoop| 87|
|hadoop| 39|
|hadoop| 29|
+------+-----+
16/06/01 23:22:19 INFO ParseDriver: Parsing command: DROP TABLE IF EXISTS sortedResultScores
16/06/01 23:22:19 INFO ParseDriver: Parse Completed
總結
1、為什麼稱作 Window function
呢?
"SELECT name,score "
+ "FROM ("
+ "SELECT "
+ "name,"
+ "score, "
+ "row_number() OVER (PARTITION BY name ORDER BY score DESC ) rank"
+ " FROM scores"
+ ") sub_scores "
+ " WHERE rank <= 4"
row_number函式作用於一個分割槽(本例中就是 spark與hadoop形成的兩個分割槽),併為該分割槽中的每條記錄生成一個序列號,這樣在外層迴圈就可以通過過濾該序列號(eg、rank<4)而取特定的資料。從功能上來看,row_number為外層查詢操作裡面的記錄,打開了一扇窗戶(寫不下去了,這個說法實在有點勉強 ~~~),暫時就這麼理解吧!
2、spark sql 通過hiveContext直接操作 hive倉庫中的資料 - 這點實在太棒了啊啊啊!
相關推薦
[2.4]以row_number為例解讀spark sql的視窗函式
參考 場景 將本地檔案toNGroup.txt中的內容: hadoop@master:~/resource$ cat toNGroup.txt hadoop 29 hadoop 87 hadoop 39 hadoop 27 hadoop 88
詳解回調函數——以JS為例解讀異步、回調和EventLoop
num csdn 指向 瀏覽器中 都是 truct 輪詢 技術 通過 回調,是非常基本的概念,尤其在現今NodeJS誕生與蓬勃發展中變得更加被人們重視。很多朋友學NodeJS,學很久一直摸不著門道,覺得最後在用Express寫Web程序,有這樣的感覺只能說明沒有學懂N
第71課:Spark SQL視窗函式解密與實戰
內容: 1.SparkSQL視窗函式解析 2.SparkSQL視窗函式實戰 一、SparkSQL視窗函式解析 1.spark支援兩種方式使用視窗函式: &nb
spark sql視窗函式
視窗函式是spark sql模組從1.4之後開始支援的,主要用於解決對一組資料進行操作,同時為每條資料返回單個結果,比如計算指定訪問資料的均值、計算累進和或訪問當前行之前行資料等,這些場景使用普通函式實現是比較困難的。 視窗函式計算的一組行,被稱為Frame。每
spark最新原始碼下載並匯入到開發環境下助推高質量程式碼(Scala IDEA for Eclipse和IntelliJ IDEA皆適用)(以spark2.2.0原始碼包為例)(圖文詳解)
不多說,直接上乾貨! 前言 其實啊,無論你是初學者還是具備了有一定spark程式設計經驗,都需要對spark原始碼足夠重視起來。 本人,肺腑之己見,想要成為大資料的大牛和頂尖專家,多結合原始碼和操練程式設計。 好一段時間之前,寫過這篇部落格
MySQL——修改root密碼的4種方法(以windows為例)
ron 情況 登錄 使用 方法 命令 ont demo root密碼 MySQL——修改root密碼的4種方法(以windows為例) 來自:http://www.jb51.net/article/39454.htm 本文以windows為例為大家詳細介紹下MySQL
[2]supervisor的使用管理:實現對異常中斷的子進程的自動重啟(以redis為例)
program usr AI turn red 重新啟動 自動 t權限 可執行文件 1:下載wget http://download.redis.io/releases/redis-3.2.8.tar.gz1下載指定版本,可以登錄https://redis.io/downl
[4]supervisor使用管理:實現對異常中斷子進程的自動重啟(以mysql為例)
grep -v rem iad apple mysq round true com 子進程 實現進程服務管理,supervisort監聽到進程死後,會自動將它重新拉起,很方便的做到進程自動恢復的功能,不再需要自己寫shell腳本來控制安裝過程1、到官網下載最新版本,解壓編譯
pytorch系列 ---5以 linear_regression為例講解神經網路實現基本步驟以及解讀nn.Linear函式
本文主要講述最簡單的線性迴歸函式: y = w
繪製指定屬性圖形(以圓為例)2.0
package javaPractice; import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.util.*; public class Point { public static void
MySQL修改root密碼的4種方法(以windows為例)
方法1: 用SET PASSWORD命令首先登入MySQL。 格式:mysql> set password for 使用者名稱@localhost = password('新密碼'); 例子:mysql> set password for [email
XBMC原始碼分析 4:視訊播放器(dvdplayer)-解碼器(以ffmpeg為例)
XBMC分析系列文章: 本文我們分析XBMC中視訊播放器(dvdplayer)中的解碼器部分。由於解碼器種類很多,不可能一一分析,因此以ffmpeg解碼器為例進行分析。 XBMC解碼器部分檔案目錄如下圖所示: 解碼器分為音訊解碼器和視訊解碼器。在這裡我們看一下視訊
MSP430 SD卡SPI讀寫操作(4) —— FatFs檔案系統實現(以MSP430F5438A為例)
本節介紹MSP430F5438A FatFs檔案系統的移植。 FatFs是一個通用的檔案系統模組,用於在小型嵌入式系統中實現FAT檔案系統。FatFs模組與IO是分開的,因此移植時需要實現下面幾個底層函式: DSTATUS disk_initialize (BYTE dr
AJAX入門學習-2:基於JS的AJAX實現(以Django為例)
data from 博客 password als ont 提交數據 open type 小生博客:http://xsboke.blog.51cto.com 如果有疑問,請點擊此處,然後發表評論交流,作者會及時回復。 ----
原創:PHP利用session,實現用戶登錄後回到點擊的頁面(本文以TP為例)
con gop query php代碼 自帶 ttr strpos 手機 roo 1、以下內容純屬原創,請謹慎選擇: ①目的:用戶登錄超時,session過期,點擊後跳轉到登錄頁,登錄成功再跳轉到鼠標點擊的頁面。 ②流程:用戶登錄---session過期---點擊跳
IOS 刪除git中的submodules 以sourceTree為例
wan .wang neapp img module 技術分享 net 子目錄 git 1、首先刪除submodule的條目 選中要刪除的子目錄 右鍵刪除,刪除之後, 該子模塊消失。 然後查看 .gitmodules 發現刪除了裏面的 [submodule "Iphon
(轉)開放window是服務器端口——以8080為例
win 做了 tcp and setting 範圍 -- .com 右上角 本文記錄兩個內容: 1.win7下打開端口 2.服務器(2003或者其他老版的系統以2003為例) 測試端口時 可用telnet 命令 偵聽端口:C:\Documents and Setti
『TensorFlow』以GAN為例的神經網絡類範式
default 方法 paper ear 類屬性 lin 簡單 貪婪 base 1、導入包: import os import time import math from glob import glob from PIL import Image import tens
循環語句總結(代碼以C#為例)
bre else col 運行 循環條件 span 表達式 條件 ons 1. while循環 代碼格式: while(循環條件) { //循環體 } 流程圖: 解讀: 如果循環條件為真,則執行循環體執行完循環體後,再判斷條件是否為真如果為真,再執行循環體然後
高斯消元以poj1222為例
tin 組成 sub ac代碼 題目 iostream tdi pre 變亮 【題目鏈接】 http://poj.org/problem?id=1222 【題目大意】 5*6的一個由燈組成的方陣 操作一個燈 周圍的上下左右四個燈會發生相應變化 即由滅變亮 由亮變滅 問