如何在pyspark dataframe中动态添加列
我试图添加几个基于输入变量vIssueCols的列如何在pyspark dataframe中动态添加列,pyspark,window-functions,Pyspark,Window Functions,我试图添加几个基于输入变量vIssueCols的列 from pyspark.sql import HiveContext from pyspark.sql import functions as F from pyspark.sql.window import Window vIssueCols=['jobid','locid'] vQuery1 = 'vSrcData2= vSrcData' vWindow1 = Window.partitionBy("vKey").orderBy("vOr
from pyspark.sql import HiveContext
from pyspark.sql import functions as F
from pyspark.sql.window import Window
vIssueCols=['jobid','locid']
vQuery1 = 'vSrcData2= vSrcData'
vWindow1 = Window.partitionBy("vKey").orderBy("vOrderBy")
for x in vIssueCols:
Query1=vQuery1+'.withColumn("'+x+'_prev",F.lag(vSrcData.'+x+').over(vWindow1))'
exec(vQuery1)
现在,上面的查询将生成如下所示的vQuery1,它正在工作,但是
vSrcData2= vSrcData.withColumn("jobid_prev",F.lag(vSrcData.jobid).over(vWindow1)).withColumn("locid_prev",F.lag(vSrcData.locid).over(vWindow1))
我不能写一个类似这样的查询吗
vSrcData2= vSrcData.withColumn(x+"_prev",F.lag(vSrcData.x).over(vWindow1))for x in vIssueCols
并使用loop语句生成列。一些博客建议添加一个udf并调用它,但我将使用上面的执行字符串方法来代替udf。您可以使用
reduce
构建查询
来自pyspark.sql.functions的导入延迟
从pyspark.sql.window导入窗口
从functools导入reduce
#样本数据
df=sc.parallelize([[1200,'1234','asdf'],
[1,50,2345,qwerty'],
[1100,'4567','xyz'],
[2300,'123,'prem'],
[2,10,000,ankur']])\
toDF([“vKey”、“vOrderBy”、“jobid”、“locid”])
df.show()
vWindow1=Window.partitionBy(“vKey”).orderBy(“vOrderBy”)
#您现有的处理
df1=df\
带列(“jobid_prev”,滞后(df.jobid).over(vWindow1))\
带列(“locid\U prev”,滞后(df.locid)。超过(vWindow1))
df1.show()
#待处理
vIssueCols=['jobid','locid']
df2=(减少)(
lambda r_df,col_name:r_df.带列(col_name+“_prev”),滞后(r_df[col_name]),超过(vWindow1),
vIssueCols,
df
))
df2.show()
样本数据:
+----+--------+-----+------+
|vKey|vOrderBy|jobid| locid|
+----+--------+-----+------+
| 1| 200| 1234| asdf|
| 1| 50| 2345|qwerty|
| 1| 100| 4567| xyz|
| 2| 300| 123| prem|
| 2| 10| 000| ankur|
+----+--------+-----+------+
输出:
+----+--------+-----+------+----------+----------+
|vKey|vOrderBy|jobid| locid|jobid_prev|locid_prev|
+----+--------+-----+------+----------+----------+
| 1| 50| 2345|qwerty| null| null|
| 1| 100| 4567| xyz| 2345| qwerty|
| 1| 200| 1234| asdf| 4567| xyz|
| 2| 10| 000| ankur| null| null|
| 2| 300| 123| prem| 000| ankur|
+----+--------+-----+------+----------+----------+
希望这有帮助 太好了。动态追加列的好方法。谢谢你的帮助!如果我想对列中的一些值进行采样,我们可以使用相同的技术来代替滞后函数吗?@RajarshiBhadra,我想是的。但是,如果你想让我们看看你的要求,那么也许你可以发布一个单独的问题,并在这里分享链接。我的问题