Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在pyspark dataframe中动态添加列_Pyspark_Window Functions - Fatal编程技术网

如何在pyspark dataframe中动态添加列

如何在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

我试图添加几个基于输入变量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("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,我想是的。但是,如果你想让我们看看你的要求,那么也许你可以发布一个单独的问题,并在这里分享链接。我的问题