1. 程式人生 > >[2.4]以row_number為例解讀spark sql的視窗函式

[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、到官網下載最新版本,解壓編譯

繪製指定屬性圖形(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的一個由燈組成的方陣 操作一個燈 周圍的上下左右四個燈會發生相應變化 即由滅變亮 由亮變滅 問