如何解决根据Spark中的日期范围填写数据
我有示例数据集,我想根据开始日期和结束日期(从2016-01-01到2016-01-08)用0填充日期。
id,date,quantity
1,2016-01-03,10
1,2016-01-04,20
1,2016-01-06,30
1,2016-01-07,20
2,2016-01-02,10
2,20
基于下面链接的解决方案,我能够实现部分解决方案。 Filling missing dates in spark dataframe column
有人可以建议如何填写从start_date到end_date的日期,即使从start_date到end_date。
id,2016-01-01,0
1,2016-01-05,2016-01-08,0
2,0
解决方法
从 ## Define your own functions above ui or inside global.R
mySEIR <- function(t,y,parms) {
with(as.list(c(y,parms)),{
# Change in Susceptibles
dS <- - beta * S * I
# Change in Exposed
dE <- beta * S * I - sigma * E
# Change in Infecteds
dI <- sigma * E - gamma * I
# Change in Recovereds
dR <- gamma * I
return(list(c(dS,dE,dI,dR)))
})
}
ui <- dashboardPage(
dashboardHeader(title = div("Test SEIR app")),dashboardSidebar(
sidebarMenu(id="tabs",menuItem("Home",tabName = "home",icon = icon("home")),menuItem("SIR",tabName = "first_app"),menuItem("SEIR",tabName = "second_app")
)
),dashboardBody(
tabItems(
tabItem(tabName = "first_app",plotOutput("plotSIR")
),tabItem(tabName = "second_app",plotOutput("plotSEIR")
)
)
)
)
server <- function(input,output,session){
output$plotSIR <- renderPlot({qplot(rnorm(500),fill=I("red"),binwidth=0.2)})
output$plotSEIR <- renderPlot({qplot(rnorm(500),fill=I("blue"),binwidth=0.2)})
}
shinyApp(ui,server)
。4 使用 Spark-2
函数从sequence
生成所有日期。
- 然后使用
2016-01-01 to 2016-01--08
联接到原始数据框以获取coalesce
值。
quantity and id
Example:
df1=sql("select explode(sequence(date('2016-01-01'),date('2016-01-08'),INTERVAL 1 DAY)) as date").\
withColumn("quantity",lit(0)).\
withColumn("id",lit(1))
df1.show()
#+----------+--------+---+
#| date|quantity| id|
#+----------+--------+---+
#|2016-01-01| 0| 1|
#|2016-01-02| 0| 1|
#|2016-01-03| 0| 1|
#|2016-01-04| 0| 1|
#|2016-01-05| 0| 1|
#|2016-01-06| 0| 1|
#|2016-01-07| 0| 1|
#|2016-01-08| 0| 1|
#+----------+--------+---+
df.show()
#+---+----------+--------+
#| id| date|quantity|
#+---+----------+--------+
#| 1|2016-01-03| 10|
#| 1|2016-01-04| 20|
#| 1|2016-01-06| 30|
#| 1|2016-01-07| 20|
#+---+----------+--------+
from pyspark.sql.functions import *
from pyspark.sql.types import *
exprs=['date']+[coalesce(col('df.'f'{f}'),col('df1.'f'{f}')).alias(f) for f in df1.columns if f not in ['date']]
df1.\
alias("df1").\
join(df.alias("df"),['date'],'left').\
select(*exprs).\
orderBy("date").\
show()
#+----------+--------+---+
#| date|quantity| id|
#+----------+--------+---+
#|2016-01-01| 0| 1|
#|2016-01-02| 0| 1|
#|2016-01-03| 10| 1|
#|2016-01-04| 20| 1|
#|2016-01-05| 0| 1|
#|2016-01-06| 30| 1|
#|2016-01-07| 20| 1|
#|2016-01-08| 0| 1|
#+----------+--------+---+
Update:
,
如果您想将空值具体填充为0,那么fillna
也是不错的选择。
import pyspark.sql.functions as f
from pyspark.sql import Window
df2 = df.select('id').distinct() \
.withColumn('date',f.expr('''explode(sequence(date('2016-01-01'),INTERVAL 1 days)) as date'''))
df2.join(df,['id','date'],'left').fillna(0).orderBy('id','date').show(20,False)
+---+----------+--------+
|id |date |quantity|
+---+----------+--------+
|1 |2016-01-01|0 |
|1 |2016-01-02|0 |
|1 |2016-01-03|10 |
|1 |2016-01-04|20 |
|1 |2016-01-05|0 |
|1 |2016-01-06|30 |
|1 |2016-01-07|20 |
|1 |2016-01-08|0 |
|2 |2016-01-01|0 |
|2 |2016-01-02|10 |
|2 |2016-01-03|10 |
|2 |2016-01-04|20 |
|2 |2016-01-05|0 |
|2 |2016-01-06|20 |
|2 |2016-01-07|20 |
|2 |2016-01-08|0 |
+---+----------+--------+
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。