scala - Spark Dataframes:将条件列添加到数据框
问题描述
我想给Flag
dataframe A加一个条件列,当满足以下两个条件时,加1 Flag
,否则加0:
num
数据帧 A 介于数据帧 BnumStart
和numEnd
数据帧 B之间。如果满足上述条件,则检查是否
include
为 1。
DataFrame A(它是一个非常大的数据框,包含数百万行):
+----+------+-----+------------------------+
|num |food |price|timestamp |
+----+------+-----+------------------------+
|1275|tomato|1.99 |2018-07-21T00:00:00.683Z|
|145 |carrot|0.45 |2018-07-21T00:00:03.346Z|
|2678|apple |0.99 |2018-07-21T01:00:05.731Z|
|6578|banana|1.29 |2018-07-20T01:11:59.957Z|
|1001|taco |2.59 |2018-07-21T01:00:07.961Z|
+----+------+-----+------------------------+
DataFrame B(它是一个非常小的 DF,仅包含 100 行):
+----------+-----------+-------+
|numStart |numEnd |include|
+----------+-----------+-------+
|0 |200 |1 |
|250 |1050 |0 |
|2000 |3000 |1 |
|10001 |15001 |1 |
+----------+-----------+-------+
预期输出:
+----+------+-----+------------------------+----------+
|num |food |price|timestamp |Flag |
+----+------+-----+------------------------+----------+
|1275|tomato|1.99 |2018-07-21T00:00:00.683Z|0 |
|145 |carrot|0.45 |2018-07-21T00:00:03.346Z|1 |
|2678|apple |0.99 |2018-07-21T01:00:05.731Z|1 |
|6578|banana|1.29 |2018-07-20T01:11:59.957Z|0 |
|1001|taco |2.59 |2018-07-21T01:00:07.961Z|0 |
+----+------+-----+------------------------+----------+
解决方案
dfB
您可以根据dfA
(i) 中描述的条件左连接,然后使用和函数构建一Flag
列“默认”为 0:withColumn
coalesce
- 找到匹配的记录将使用
include
匹配dfB
记录的值 - 没有匹配的记录将有
include=null
,并且根据您的要求,这些记录应该得到Flag=0
,所以我们使用coalesce
which 在 null 的情况下返回带有文字的默认值lit(0)
最后,去掉dfB
你不感兴趣的列:
import org.apache.spark.sql.functions._
import spark.implicits._ // assuming "spark" is your SparkSession
dfA.join(dfB, $"num".between($"numStart", $"numEnd"), "left")
.withColumn("Flag", coalesce($"include", lit(0)))
.drop(dfB.columns: _*)
.show()
// +----+------+-----+--------------------+----+
// | num| food|price| timestamp|Flag|
// +----+------+-----+--------------------+----+
// |1275|tomato| 1.99|2018-07-21T00:00:...| 0|
// | 145|carrot| 0.45|2018-07-21T00:00:...| 1|
// |2678| apple| 0.99|2018-07-21T01:00:...| 1|
// |6578|banana| 1.29|2018-07-20T01:11:...| 0|
// |1001| taco| 2.59|2018-07-21T01:00:...| 0|
// +----+------+-----+--------------------+----+
推荐阅读
- unity3d - 我们可以在着色器中编写自己的采样和包装逻辑吗?可能是什么问题?
- python - Pandas apply() 条件为最后一个非空值及其索引
- android - Android:Webrtc 如何在录制视频通话时录制(发送方和接收方)的音频
- reactjs - 防止组件在特定页面 react-router 中呈现
- vba - 如何运行需要参数“myitem As Outlook.mailItem”的宏?
- azure - AKS pod 之间的请求超时
- sql-server - MSSQL - 在 where 和 on 子句性能上添加条件
- angular6 - 在 Angular 6 中使用 npm 安装 tinyMCE
- r - R:抑制 renv 项目启动消息
- python - 如何在每个 bin 中绘制中值,并显示 25% 和 75% 的值