第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

具有復(fù)雜條件的Spark SQL窗口函數(shù)

具有復(fù)雜條件的Spark SQL窗口函數(shù)

收到一只叮咚 2019-09-03 15:57:44
這可能是最容易通過(guò)示例解釋的。假設(shè)我有一個(gè)用戶(hù)登錄網(wǎng)站的DataFrame,例如:scala> df.show(5)+----------------+----------+|       user_name|login_date|+----------------+----------+|SirChillingtonIV|2012-01-04||Booooooo99900098|2012-01-04||Booooooo99900098|2012-01-06||  OprahWinfreyJr|2012-01-10||SirChillingtonIV|2012-01-11|+----------------+----------+only showing top 5 rows我想在此列添加一個(gè)列,指示他們何時(shí)成為網(wǎng)站上的活躍用戶(hù)。但有一點(diǎn)需要注意:有一段時(shí)間用戶(hù)被認(rèn)為是活動(dòng)的,在此期間之后,如果他們?cè)俅蔚卿?,他們的became_active日期會(huì)重置。假設(shè)這段時(shí)間是5天。然后從上表派生的所需表將是這樣的:+----------------+----------+-------------+|       user_name|login_date|became_active|+----------------+----------+-------------+|SirChillingtonIV|2012-01-04|   2012-01-04||Booooooo99900098|2012-01-04|   2012-01-04||Booooooo99900098|2012-01-06|   2012-01-04||  OprahWinfreyJr|2012-01-10|   2012-01-10||SirChillingtonIV|2012-01-11|   2012-01-11|+----------------+----------+-------------+因此,特別是,SirChillingtonIV的became_active日期被重置,因?yàn)樗麄兊牡诙蔚卿浭窃诨顒?dòng)期過(guò)期之后,但是Booooooo99900098的became_active日期沒(méi)有在他/她登錄的第二次重置,因?yàn)樗湓诨顒?dòng)期間。我最初的想法是使用窗口函數(shù)lag,然后使用lagged值填充became_active列; 例如,大致類(lèi)似于:import org.apache.spark.sql.expressions.Windowimport org.apache.spark.sql.functions._val window = Window.partitionBy("user_name").orderBy("login_date")val df2 = df.withColumn("tmp", lag("login_date", 1).over(window))然后,規(guī)則填寫(xiě)became_active日期會(huì)是這樣,如果tmp是null(即,如果它是第一次登錄),或者如果login_date - tmp >= 5再became_active = login_date; 否則,轉(zhuǎn)到下一個(gè)最近的值tmp并應(yīng)用相同的規(guī)則。這表明了一種遞歸方法,我無(wú)法想象實(shí)現(xiàn)的方法。我的問(wèn)題:這是一種可行的方法,如果是這樣的話,我怎么能“回頭”看看早期的價(jià)值觀,tmp直到我找到一個(gè)停止的地方?據(jù)我所知,我無(wú)法迭代Spark SQL的值Column。還有另一種方法來(lái)實(shí)現(xiàn)這個(gè)結(jié)果嗎?
查看完整描述

2 回答

?
呼啦一陣風(fēng)

TA貢獻(xiàn)1802條經(jīng)驗(yàn) 獲得超6個(gè)贊

重構(gòu)對(duì)方的回答 與工作Pyspark


在Pyspark你可以像下面。


create data frame


df = sqlContext.createDataFrame(

[

("SirChillingtonIV", "2012-01-04"), 

("Booooooo99900098", "2012-01-04"), 

("Booooooo99900098", "2012-01-06"), 

("OprahWinfreyJr", "2012-01-10"), 

("SirChillingtonIV", "2012-01-11"), 

("SirChillingtonIV", "2012-01-14"), 

("SirChillingtonIV", "2012-08-11")

], 

("user_name", "login_date"))

上面的代碼創(chuàng)建了一個(gè)如下所示的數(shù)據(jù)框


+----------------+----------+

|       user_name|login_date|

+----------------+----------+

|SirChillingtonIV|2012-01-04|

|Booooooo99900098|2012-01-04|

|Booooooo99900098|2012-01-06|

|  OprahWinfreyJr|2012-01-10|

|SirChillingtonIV|2012-01-11|

|SirChillingtonIV|2012-01-14|

|SirChillingtonIV|2012-08-11|

+----------------+----------+

現(xiàn)在我們要先發(fā)現(xiàn)它們之間的區(qū)別login_date是多于5幾天。


對(duì)于這個(gè),如下所示。


必要的進(jìn)口


from pyspark.sql import functions as f

from pyspark.sql import Window



# defining window partitions  

login_window = Window.partitionBy("user_name").orderBy("login_date")

session_window = Window.partitionBy("user_name", "session")


session_df = df.withColumn("session", f.sum((f.coalesce(f.datediff("login_date", f.lag("login_date", 1).over(login_window)), f.lit(0)) > 5).cast("int")).over(login_window))

當(dāng)我們運(yùn)行上面的代碼行時(shí),如果date_diff是,NULL則coalesce函數(shù)將替換NULL為0。


+----------------+----------+-------+

|       user_name|login_date|session|

+----------------+----------+-------+

|  OprahWinfreyJr|2012-01-10|      0|

|SirChillingtonIV|2012-01-04|      0|

|SirChillingtonIV|2012-01-11|      1|

|SirChillingtonIV|2012-01-14|      1|

|SirChillingtonIV|2012-08-11|      2|

|Booooooo99900098|2012-01-04|      0|

|Booooooo99900098|2012-01-06|      0|

+----------------+----------+-------+



# add became_active column by finding the `min login_date` for each window partitionBy `user_name` and `session` created in above step

final_df = session_df.withColumn("became_active", f.min("login_date").over(session_window)).drop("session")


+----------------+----------+-------------+

|       user_name|login_date|became_active|

+----------------+----------+-------------+

|  OprahWinfreyJr|2012-01-10|   2012-01-10|

|SirChillingtonIV|2012-01-04|   2012-01-04|

|SirChillingtonIV|2012-01-11|   2012-01-11|

|SirChillingtonIV|2012-01-14|   2012-01-11|

|SirChillingtonIV|2012-08-11|   2012-08-11|

|Booooooo99900098|2012-01-04|   2012-01-04|

|Booooooo99900098|2012-01-06|   2012-01-04|

+----------------+----------+-------------+


查看完整回答
反對(duì) 回復(fù) 2019-09-03
  • 2 回答
  • 0 關(guān)注
  • 785 瀏覽
慕課專(zhuān)欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢(xún)優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)