Python Pyspark dataframe将列除以列中的常量值,而不收集数据帧
我在一个网站上有一个pyspark数据框架,每个特定的日子都有用户登录会话数,但按注册日期划分。我想将这些计数除以注册当天的计数,得到分数。这意味着,如果字段DaysSincerRegistration为0,则分数值将始终为1Python Pyspark dataframe将列除以列中的常量值,而不收集数据帧,python,pyspark,apache-spark-sql,Python,Pyspark,Apache Spark Sql,我在一个网站上有一个pyspark数据框架,每个特定的日子都有用户登录会话数,但按注册日期划分。我想将这些计数除以注册当天的计数,得到分数。这意味着,如果字段DaysSincerRegistration为0,则分数值将始终为1 +----------+----------+---------------------+-----+ |sessionDay| regDate|daysSinceRegistration|count| +----------+----------+---------
+----------+----------+---------------------+-----+
|sessionDay| regDate|daysSinceRegistration|count|
+----------+----------+---------------------+-----+
|2019-06-11|2019-06-10| 1| 6463|
|2019-06-11|2019-06-11| 0|14452|
|2019-06-11|2019-06-09| 2| 3878|
+----------+----------+---------------------+-----+
我知道这可以通过以下方式实现:
dayZeroCount = sessions_no_segmentations.filter(sessions_no_segmentations['daysSinceRegistration'] == 0).collect()[0]['count']
sessions_no_segmentations = sessions_no_segmentations.withColumn('percentUsers', fun.col('count')/dayZeroCount)
但是,这需要一个collect()
调用,调用非常繁重,并且这段代码需要在短时间内运行很多次(大约300个不同的数据帧)。调用collect()
似乎不是理想的方法
有没有方法可以在不调用此
collect()
调用的情况下获得所需的结果?数据帧只有一行dayssincerregistration==0
?只需在该条件下将数据帧连接到自身即可。类似于df.alias(“r”).join(df.where(“dayssincerregistration==0”).select(“count”).alias(“r”).selectExpr(“r.*,r.count/l.count as percentUsers”)
仍然需要进行一些修补,但它确实做到了!非常感谢你!一个数据帧只有一行daysSinceRegistration==0
?只需在该条件下将数据帧连接到自身即可。类似于df.alias(“r”).join(df.where(“dayssincerregistration==0”).select(“count”).alias(“r”).selectExpr(“r.*,r.count/l.count as percentUsers”)
仍然需要进行一些修补,但它确实做到了!非常感谢你!