在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

介紹幾個Hive常用的函數吧!

電子工程師 ? 來源:lq ? 2019-02-11 11:32 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

咳咳,今天來介紹一下幾個Hive函數吧,先放一張我登哥劃水的照片,希望大家也做一只自由的魚兒,在知識的海洋里游呀游,嘻嘻!

今天我們來介紹幾個Hive常用的函數吧!

首先我們產生我們的數據,使用spark sql來產生吧:

valdata=Seq[(String,String)](("{"userid":"1","action":"0#222"}","20180131"),("{"userid":"1","action":"1#223"}","20180131"),("{"userid":"1","action":"2#224"}","20180131"),("{"userid":"1","action":"1#225"}","20180131"),("{"userid":"1","action":"2#225"}","20180131"),("{"userid":"1","action":"0#226"}","20180131"),("{"userid":"1","action":"1#227"}","20180131"),("{"userid":"1","action":"2#228"}","20180131"),("{"userid":"2","action":"0#223"}","20180131"),("{"userid":"2","action":"1#224"}","20180131"),("{"userid":"2","action":"1#225"}","20180131"),("{"userid":"2","action":"2#228"}","20180131")).toDF("info","dt").write.saveAsTable("test.sxw_testRowNumber")

為了模擬我們的hive函數,我們特地將info字段寫成了一個json格式,info中有兩個鍵值對,一個是user_id,另一個是用戶的行為,行為中有兩個數據,用#隔開,分別是動作的類型和動作發生的時間。我們可以這樣認為,0代表百度首頁,1代表進行了一次搜索的搜索結果頁,2代表查看搜索結果中國年的某個詳情頁。從一次動作0 到 下一次動作0,我們可以認為這是用戶和百度一次完整的交互,即一次session,從一次動作1到下一次動作1,可以認為是一次完整的搜索操作。另一個字段是dt,即我們的分區字段。

我們用簡單的查詢語句來看一下我們的數據效果:

select*fromtest.sxw_testRowNumberwheredt=20180131

結果如下:

get_json_object

我們使用get_json_object來解析json格式字符串里面的內容,格式如下:

get_json_object(字段名,'$.key')

這里,我們來解析info中的userid和action:

selectget_json_object(info,'$.userid')asuser_id,get_json_object(info,'$.action')asactionfromtest.sxw_testRowNumberwheredt=20180131

結果如下:

字符串替換函數

字符串替換函數格式如下:

regexp_replace(字段名,被替換的內容,替換為的內容)

這里我們是可以寫正則表達式來替換的,比如我們想把#和數字都替換成大寫字母Y:

selectregexp_replace(info,'[\d#]','Y')asinfofromtest.sxw_testRowNumberwheredt=20180131

在上面的語句中,我們用了兩個,因為這里需要進行轉義。結果為:

字符串切分函數

字符串切分函數split,很像我們javapython中寫的那樣,格式如下:

split(字段名,分割字符)

split分割后返回一個數組,我們可以用下標取出每個元素。我們把action里面的動作類型和動作時間使用split分割開,語句如下:

selectget_json_object(info,'$.userid')asuser_id,split(get_json_object(info,'$.action'),'#')[0]asaction_type,split(get_json_object(info,'$.action'),'#')[1]asaction_tsfromtest.sxw_testRowNumberwheredt=20180131

結果如下:

取字串

取字串使用substring方法,格式如下:

substring(字段名,開始位置,提取長度)

這里,如果我們想吧info中前后的大括號去掉,可以使用substring,語句如下:

selectsubstring(info,2,length(info)-2)asinfofromtest.sxw_testRowNumberwheredt=20180131

你可能會問,為什么開始位置是從2開始的而不是1,因為hive中字符串的索引是從1開始的而不是0,同時,我們誰用length方法來計算字符串的長度,結果如下:

有條件計數

有條件計數使用count函數結合case when then語法來實現,比如我們要計算每個用戶有多少個session,語句如下:

selectget_json_object(info,'$.userid')asuser_id,count(casewhensplit(get_json_object(info,'$.action'),'#')[0]=='0'then1elsenullend)assession_countfromtest.sxw_testRowNumberwheredt=20180131groupbyget_json_object(info,'$.userid')

結果如下:

上面的幾個函數都只是簡單的開胃菜,接下來我們來介紹一下重頭戲,分組排序函數以及它的兩個衍生的函數,row_number() over的格式如下:

row_Number()OVER(partitionby分組字段ORDERBY排序字段排序方式asc/desc)

簡單的說,我們使用partition by后面的字段對數據進行分組,在每個組內,使用ORDER BY后面的字段進行排序,并給每條記錄增加一個排序序號。比如,我們根據每個用戶每條記錄的發生時間對用戶的行為進行排序,并添加一個序號:

select*row_number()over(partitionbyuser_idorderbyaction_tsasc)astnfrom(selectget_json_object(info,'$.userid')asuser_id,split(get_json_object(info,'$.action'),'#')[0]asaction_type,split(get_json_object(info,'$.action'),'#')[1]asaction_tsfromtest.sxw_testRowNumberwheredt=20180131)ast

執行結果如下:

可以看到,我們已經成功給用戶的行為添加了發生序號。

除了row_number以外,我們還有兩個函數,分別是:

lag(字段名,N)over(partitionby分組字段orderby排序字段排序方式)lead(字段名,N)over(partitionby分組字段orderby排序字段排序方式)lag(字段名,N) over(partition by 分組字段 order by 排序字段 排序方式) lead(字段名,N) over(partition by 分組字段 order by 排序字段 排序方式)

lag括號里理由兩個參數,第一個是字段名,第二個是數量N,這里的意思是,取分組排序之后比該條記錄序號小N的對應記錄的指定字段的值,如果字段名為ts,N為1,就是取分組排序之后上一條記錄的ts值。

lead括號里理由兩個參數,第一個是字段名,第二個是數量N,這里的意思是,取分組排序之后比該條記錄序號大N的對應記錄的對應字段的值,如果字段名為ts,N為1,就是取分組排序之后下一條記錄的ts值。

比如,我們用lag和lead分別記錄用戶上一次行為和下一次行為的發生時間,語句如下:

select*,row_number()over(partitionbyuser_idorderbyaction_tsasc)astn,lag(action_ts,1)over(partitionbyuser_idorderbyaction_tsasc)asprev_ts,lead(action_ts,1)over(partitionbyuser_idorderbyaction_tsasc)asnext_tsfrom(selectget_json_object(info,'$.userid')asuser_id,split(get_json_object(info,'$.action'),'#')[0]asaction_type,split(get_json_object(info,'$.action'),'#')[1]asaction_tsfromtest.sxw_testRowNumberwheredt=20180131)ast

結果如下:

接下來,我們想實現下面的功能:給每條記錄添加一列,該列代表此次session的開始時間。

前面我們介紹過,我們這里認為一次session是從一個action_type為0開始,到下一次action_type為0結束,也就是說,我們這里的數據有三個session,前5條記錄是一個session,這五條記錄的新列的值應給為222,同理,中間三條記錄的新列的值應改為226,而最后四條記錄的值應為223,那么如何實現這個功能呢,這就需要我們的lag和lead函數啦。

語句如下:

selectt2.user_id,t2.action_type,t2.action_ts,t1.action_tsassession_tsfrom(select*,lead(action_ts,1)over(partitionbyuser_idorderbyaction_tsasc)asnext_tsfrom(selectget_json_object(info,'$.userid')asuser_id,split(get_json_object(info,'$.action'),'#')[0]asaction_type,split(get_json_object(info,'$.action'),'#')[1]asaction_tsfromtest.sxw_testRowNumberwheredt=20180131andsplit(get_json_object(info,'$.action'),'#')[0]=='0')ast)t1innerjoin(selectget_json_object(info,'$.userid')asuser_id,split(get_json_object(info,'$.action'),'#')[0]asaction_type,split(get_json_object(info,'$.action'),'#')[1]asaction_tsfromtest.sxw_testRowNumberwheredt=20180131)t2ont1.user_id=t2.user_idwhere(t2.action_ts>=t1.action_tsandt2.action_ts=t1.action_tsandt1.next_tsisnull)

我們來一步步剖析一下該過程的實現,首先,我們在子查詢中實現了兩個表的內鏈接。第一個子查詢查詢出所有session開始的action_ts以及它對應的下一個session開始的action_ts,使用lead實現:

select*,lead(action_ts,1)over(partitionbyuser_idorderbyaction_tsasc)asnext_tsfrom(selectget_json_object(info,'$.userid')asuser_id,split(get_json_object(info,'$.action'),'#')[0]asaction_type,split(get_json_object(info,'$.action'),'#')[1]asaction_tsfromtest.sxw_testRowNumberwheredt=20180131andsplit(get_json_object(info,'$.action'),'#')[0]=='0')ast

第二個子查詢,將簡單的進行一下解析:

selectget_json_object(info,'$.userid')asuser_id,split(get_json_object(info,'$.action'),'#')[0]asaction_type,split(get_json_object(info,'$.action'),'#')[1]asaction_tsfromtest.sxw_testRowNumberwheredt=20180131

隨后,我們根據兩個表的user_id進行內鏈接,但是內鏈接之后會多出很多數據,我們要從中取出滿足條件的,這里的條件有兩個,滿足其一即可,即記錄的ts在兩個session開始的ts之間,要么就沒有后一個session:

where(t2.action_ts>=t1.action_tsandt2.action_ts=t1.action_tsandt1.next_tsisnull)

最終的結果如下:

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 函數
    +關注

    關注

    3

    文章

    4376

    瀏覽量

    64485
  • 數組
    +關注

    關注

    1

    文章

    419

    瀏覽量

    26440

原文標題:來學習幾個簡單的Hive函數啦

文章出處:【微信號:atleadai,微信公眾號:LeadAI OpenLab】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    常用電子元器件介紹

    電子發燒友網站提供《常用電子元器件介紹.pptx》資料免費下載
    發表于 06-24 16:54 ?1次下載

    MSP430常用內聯函數說明

    電子發燒友網站提供《MSP430常用內聯函數說明.docx》資料免費下載
    發表于 06-05 17:20 ?0次下載

    分布式存儲數據恢復—虛擬機上hbase和hive數據庫數據恢復案例

    分布式存儲數據恢復環境: 16臺某品牌R730xd服務器節點,每臺服務器節點上有數臺虛擬機。 虛擬機上部署Hbase和Hive數據庫。 分布式存儲故障: 數據庫底層文件被誤刪除,數據庫不能使用。要求恢復hbase和hive數據庫。
    的頭像 發表于 04-17 11:05 ?195次閱讀

    常用SQL函數及其用法

    SQL(Structured Query Language)是一種用于管理和操作關系數據庫的編程語言。SQL 提供了豐富的函數庫,用于數據檢索、數據更新、數據刪除以及數據聚合等操作。以下是一些常用
    的頭像 發表于 11-19 10:18 ?1334次閱讀

    RNN的損失函數與優化算法解析

    函數有以下幾種: 交叉熵損失函數 :交叉熵(Cross Entropy)是一種評估兩個概率分布之間差異的度量方法,即通過比較模型預測的概率分布和真實概率分布之間的差異,來評估模型訓練的性能。在RNN中,交叉熵損失函數
    的頭像 發表于 11-15 10:16 ?1335次閱讀

    SUMIF函數與SUMIFS函數的區別

    SUMIF函數和SUMIFS函數都是Excel中用于條件求和的函數,它們可以幫助用戶根據特定的條件對數據進行求和。盡管它們的基本功能相似,但在使用場景和功能上存在一些差異。以下是對這兩個函數
    的頭像 發表于 10-30 09:51 ?7196次閱讀

    Python常用函數大全

    在 Python 世界里,有一些寶藏函數和模塊,它們可以讓你編程更輕松、代碼更高效。這篇文章將帶你一一認識這些神器,讓你的開發生活瞬間輕松不少!
    的頭像 發表于 10-27 17:20 ?848次閱讀

    什么叫系統的頻率響應函數?它和傳遞函數有何關系

    工具。它是一個復數函數,通常用H(jω)表示,其中ω是角頻率,j是虛數單位。頻率響應函數可以提供系統在頻域內的行為特征,包括系統的增益、相位以及共振頻率等信息。 頻率響應函數與傳遞
    的頭像 發表于 10-18 09:29 ?4554次閱讀

    labview常用的基本函數

    電子發燒友網站提供《labview常用的基本函數.pdf》資料免費下載
    發表于 10-15 17:29 ?7次下載

    大數據從業者必知必會的Hive SQL調優技巧

    大數據從業者必知必會的Hive SQL調優技巧 摘要 :在大數據領域中,Hive SQL被廣泛應用于數據倉庫的數據查詢和分析。然而,由于數據量龐大和復雜的查詢需求,Hive SQL查詢的性能往往
    的頭像 發表于 09-24 13:30 ?657次閱讀

    labview中常用的字符串函數有哪些?

    在LabVIEW中,常用的字符串函數廣泛覆蓋了對字符串的各種操作,包括但不限于格式化、搜索、替換、連接、計算長度等。以下是一些常用的字符串函數及其簡要說明: 字符串長度(String
    的頭像 發表于 09-04 15:43 ?1746次閱讀

    簡述socket編程中的常用函數

    Socket編程是一種基于TCP/IP協議的網絡編程技術,它允許應用程序通過網絡進行通信。在Socket編程中,有許多常用函數,它們用于創建、配置、連接、發送和接收數據等操作。以下是對這些常用
    的頭像 發表于 08-16 10:49 ?849次閱讀

    shell基本介紹常用命令之shell介紹

    是“$”,在命令提示符后邊輸入命令即可和系統進行交互操作。Ubuntu默認的Shell是Bash(Bourne Again Shell)。Linux命令有很多,功能比較強大,下節我們簡單介紹一些常用
    發表于 08-15 09:28

    cnn常用幾個模型有哪些

    CNN(卷積神經網絡)是一種深度學習模型,廣泛應用于圖像識別、自然語言處理等領域。以下是一些常用的CNN模型: LeNet-5:LeNet-5是最早的卷積神經網絡之一,由Yann LeCun等人于
    的頭像 發表于 07-11 14:58 ?1824次閱讀

    神經網絡中的激活函數有哪些

    在神經網絡中,激活函數是一個至關重要的組成部分,它決定了神經元對于輸入信號的反應方式,為神經網絡引入了非線性因素,使得網絡能夠學習和處理復雜的模式。本文將詳細介紹神經網絡中常用的激活函數
    的頭像 發表于 07-01 11:52 ?1083次閱讀
    主站蜘蛛池模板: 黄色成人在线 | 五月婷色 | 色网站在线 | 午夜黄页网站在线播放 | 午夜在线网站 | 日本人xxxxxxxxxⅹ69 | japanese日本护士xx亚洲 | 国产亚洲情侣久久精品 | 午夜小视频在线播放 | 男人天堂伊人 | 福利片在线播放 | 激情网站网址 | 国产成人毛片视频不卡在线 | 色综合天天综合网国产成人 | 在线免费视频手机版 | 日韩在线毛片 | 天天欧美 | 欧美一区二区三区精品 | 免费爱爱视频 | 国产精品久久久久aaaa | www.夜色| 亚洲女同一区二区 | 午夜影院0606免费 | 2022第二三四天堂网 | 亚洲成网777777国产精品 | 亚洲最大成人网色 | 黄网站视频观看免费 | 天天色天天碰 | 毛片.com| 欧美猛交喷潮在线播放 | 一级特黄毛片 | 日日操夜夜操狠狠操 | 久久人人精品 | 种子在线搜索 | 日本黄色三级视频 | 九九九精品午夜在线观看 | 国产片在线观看狂喷潮bt天堂 | 韩国电影天堂网 | 欧美大片一区二区 | 校园激情综合网 | 国产精品嫩草影院午夜 |