色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

介紹幾個(gè)Hive常用的函數(shù)吧!

電子工程師 ? 來源:lq ? 2019-02-11 11:32 ? 次閱讀

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

今天我們來介紹幾個(gè)Hive常用的函數(shù)吧!

首先我們產(chǎn)生我們的數(shù)據(jù),使用spark sql來產(chǎn)生吧:

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函數(shù),我們特地將info字段寫成了一個(gè)json格式,info中有兩個(gè)鍵值對,一個(gè)是user_id,另一個(gè)是用戶的行為,行為中有兩個(gè)數(shù)據(jù),用#隔開,分別是動作的類型和動作發(fā)生的時(shí)間。我們可以這樣認(rèn)為,0代表百度首頁,1代表進(jìn)行了一次搜索的搜索結(jié)果頁,2代表查看搜索結(jié)果中國年的某個(gè)詳情頁。從一次動作0 到 下一次動作0,我們可以認(rèn)為這是用戶和百度一次完整的交互,即一次session,從一次動作1到下一次動作1,可以認(rèn)為是一次完整的搜索操作。另一個(gè)字段是dt,即我們的分區(qū)字段。

我們用簡單的查詢語句來看一下我們的數(shù)據(jù)效果:

select*fromtest.sxw_testRowNumberwheredt=20180131

結(jié)果如下:

get_json_object

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

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

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

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

結(jié)果如下:

字符串替換函數(shù)

字符串替換函數(shù)格式如下:

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

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

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

在上面的語句中,我們用了兩個(gè),因?yàn)檫@里需要進(jìn)行轉(zhuǎn)義。結(jié)果為:

字符串切分函數(shù)

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

split(字段名,分割字符)

split分割后返回一個(gè)數(shù)組,我們可以用下標(biāo)取出每個(gè)元素。我們把a(bǔ)ction里面的動作類型和動作時(shí)間使用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

結(jié)果如下:

取字串

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

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

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

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

你可能會問,為什么開始位置是從2開始的而不是1,因?yàn)閔ive中字符串的索引是從1開始的而不是0,同時(shí),我們誰用length方法來計(jì)算字符串的長度,結(jié)果如下:

有條件計(jì)數(shù)

有條件計(jì)數(shù)使用count函數(shù)結(jié)合case when then語法來實(shí)現(xiàn),比如我們要計(jì)算每個(gè)用戶有多少個(gè)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')

結(jié)果如下:

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

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

簡單的說,我們使用partition by后面的字段對數(shù)據(jù)進(jìn)行分組,在每個(gè)組內(nèi),使用ORDER BY后面的字段進(jìn)行排序,并給每條記錄增加一個(gè)排序序號。比如,我們根據(jù)每個(gè)用戶每條記錄的發(fā)生時(shí)間對用戶的行為進(jìn)行排序,并添加一個(gè)序號:

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

執(zhí)行結(jié)果如下:

可以看到,我們已經(jīng)成功給用戶的行為添加了發(fā)生序號。

除了row_number以外,我們還有兩個(gè)函數(shù),分別是:

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括號里理由兩個(gè)參數(shù),第一個(gè)是字段名,第二個(gè)是數(shù)量N,這里的意思是,取分組排序之后比該條記錄序號小N的對應(yīng)記錄的指定字段的值,如果字段名為ts,N為1,就是取分組排序之后上一條記錄的ts值。

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

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

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

結(jié)果如下:

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

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

語句如下:

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)

我們來一步步剖析一下該過程的實(shí)現(xiàn),首先,我們在子查詢中實(shí)現(xiàn)了兩個(gè)表的內(nèi)鏈接。第一個(gè)子查詢查詢出所有session開始的action_ts以及它對應(yīng)的下一個(gè)session開始的action_ts,使用lead實(shí)現(xiàn):

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

第二個(gè)子查詢,將簡單的進(jìn)行一下解析:

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

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

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

最終的結(jié)果如下:

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4333

    瀏覽量

    62724
  • 數(shù)組
    +關(guān)注

    關(guān)注

    1

    文章

    417

    瀏覽量

    25974

原文標(biāo)題:來學(xué)習(xí)幾個(gè)簡單的Hive函數(shù)啦

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

收藏 人收藏

    評論

    相關(guān)推薦

    常用SQL函數(shù)及其用法

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

    Python常用函數(shù)大全

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

    labview常用的基本函數(shù)

    電子發(fā)燒友網(wǎng)站提供《labview常用的基本函數(shù).pdf》資料免費(fèi)下載
    發(fā)表于 10-15 17:29 ?7次下載

    大數(shù)據(jù)從業(yè)者必知必會的Hive SQL調(diào)優(yōu)技巧

    大數(shù)據(jù)從業(yè)者必知必會的Hive SQL調(diào)優(yōu)技巧 摘要 :在大數(shù)據(jù)領(lǐng)域中,Hive SQL被廣泛應(yīng)用于數(shù)據(jù)倉庫的數(shù)據(jù)查詢和分析。然而,由于數(shù)據(jù)量龐大和復(fù)雜的查詢需求,Hive SQL查詢的性能往往
    的頭像 發(fā)表于 09-24 13:30 ?278次閱讀

    labview中常用的字符串函數(shù)有哪些?

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

    簡述socket編程中的常用函數(shù)

    Socket編程是一種基于TCP/IP協(xié)議的網(wǎng)絡(luò)編程技術(shù),它允許應(yīng)用程序通過網(wǎng)絡(luò)進(jìn)行通信。在Socket編程中,有許多常用函數(shù),它們用于創(chuàng)建、配置、連接、發(fā)送和接收數(shù)據(jù)等操作。以下是對這些常用
    的頭像 發(fā)表于 08-16 10:49 ?408次閱讀

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

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

    cnn常用幾個(gè)模型有哪些

    CNN(卷積神經(jīng)網(wǎng)絡(luò))是一種深度學(xué)習(xí)模型,廣泛應(yīng)用于圖像識別、自然語言處理等領(lǐng)域。以下是一些常用的CNN模型: LeNet-5:LeNet-5是最早的卷積神經(jīng)網(wǎng)絡(luò)之一,由Yann LeCun等人于
    的頭像 發(fā)表于 07-11 14:58 ?896次閱讀

    函數(shù)信號發(fā)生器怎么調(diào)頻率

    函數(shù)信號發(fā)生器是一種常用的電子測試設(shè)備,它能夠產(chǎn)生各種波形、頻率和幅度的信號,廣泛應(yīng)用于科研、教學(xué)、生產(chǎn)和維修等領(lǐng)域。在使用函數(shù)信號發(fā)生器時(shí),調(diào)整頻率是其中一個(gè)非常重要的步驟。本文將詳細(xì)介紹
    的頭像 發(fā)表于 05-20 18:23 ?1660次閱讀

    MATLAB信號處理常用函數(shù)詳解

    MATLAB是一款功能強(qiáng)大的數(shù)學(xué)軟件,尤其在信號處理領(lǐng)域,它提供了眾多的函數(shù)和工具箱,使得信號的分析、處理、仿真變得簡單而高效。本文將詳細(xì)介紹MATLAB在信號處理中常用函數(shù),并通過
    的頭像 發(fā)表于 05-17 14:31 ?2374次閱讀

    函數(shù)信號發(fā)生器按鍵介紹

    函數(shù)信號發(fā)生器是電子測試領(lǐng)域中不可或缺的重要工具,它能夠模擬產(chǎn)生各種波形信號,如正弦波、方波、三角波等,廣泛應(yīng)用于電路測試、信號模擬、科學(xué)研究等多個(gè)領(lǐng)域。函數(shù)信號發(fā)生器的按鍵設(shè)計(jì)是其功能實(shí)現(xiàn)的重要組成部分,本文將對函數(shù)信號發(fā)生器
    的頭像 發(fā)表于 05-15 16:14 ?1977次閱讀

    分享幾個(gè)嵌入式中常用的GUI

    交互,完成各種操作,可提高工作效率以及用戶體驗(yàn)。接下來看一下我們開發(fā)中常用的GUI框架有哪些~二、開源輕量級顯示框架LVGLLVGL(LightandVersat
    的頭像 發(fā)表于 04-06 08:09 ?1632次閱讀
    分享<b class='flag-5'>幾個(gè)</b>嵌入式中<b class='flag-5'>常用</b>的GUI

    回調(diào)函數(shù)(callback)是什么?回調(diào)函數(shù)的實(shí)現(xiàn)方法

    回調(diào)函數(shù)是一種特殊的函數(shù),它作為參數(shù)傳遞給另一個(gè)函數(shù),并在被調(diào)用函數(shù)執(zhí)行完畢后被調(diào)用。回調(diào)函數(shù)常用
    發(fā)表于 03-12 11:46 ?3003次閱讀

    典型環(huán)節(jié)的傳遞函數(shù)介紹

    電子發(fā)燒友網(wǎng)站提供《典型環(huán)節(jié)的傳遞函數(shù)介紹.pdf》資料免費(fèi)下載
    發(fā)表于 03-01 10:28 ?2次下載

    常用封裝尺寸資料介紹

    電子發(fā)燒友網(wǎng)站提供《常用封裝尺寸資料介紹.zip》資料免費(fèi)下載
    發(fā)表于 02-29 09:23 ?0次下載
    主站蜘蛛池模板: 解开白丝老师的短裙猛烈进入| 日本黄色www| 亚洲日韩在线观看| 蜜桃日本MV免费观看| 大胆国模一区二区三区伊人 | 翁熄性放纵交换01| 乱码AV午夜噜噜噜噜| 国产精品久久久久婷婷五月色婷婷| 中文字幕成人免费高清在线| 色偷偷91综合久久噜噜| 伦理 电影在线观看百度影音| 极品少妇高潮啪啪无码吴梦| 国产精品一区二区激情| japanesen女同| 益日韩欧群交P片内射中文| 神马电影院午 夜理论| 美女被日出水| 精品一区二区三区AV天堂| 高h超辣bl文| a毛片基地免费全部视频| 野花影院手机在线观看 | 亚洲精品高清视频| 日日碰狠狠添天天爽| 欧美 亚洲 另类 综合网| 激情女人花| 久久国产精品萌白酱免费| 国产免费久久爱久久啪| 爱暖暖1000部免费| 97亚洲狠狠色综合久久久久| 亚洲综合国产精品| 在线播放免费人成毛片视频| 亚洲精品www久久久久久| 亚洲日本天堂在线| 在线视频免费国产成人| 99精品国产免费观看视频| 中文字幕无码亚洲字幕成A人蜜桃| 樱花动漫成人隐藏入口| 99九九99九九九视频精品| 白丝高中生被c爽哭| 国产精品无码视频一区二区| 精品国产乱码久久久久乱码|