我想将条件列Flag
添加到数据帧A。满足以下两个条件时,将1添加到Flag
,否则添加0:
num
在数据帧B中的numStart
和numEnd
之间。
如果满足上述条件,请检查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 |
+----+------+-----+------------------------+----------+
答案 0 :(得分:0)
在第一个条件下将两个数据框连接在一起,同时将所有行保留在数据框A中(即,通过左连接,请参见下面的代码)。联接之后,include
列可以重命名为Flag
,并且其中的所有NaN值都将设置为0。另外两个列numStart
和numEnd
将被删除。 / p>
因此,代码可以编写如下:
A.join(B, $"num" >= $"numStart" && $"num" <= $"numEnd", "left")
.withColumnRenamed("include", "Flag")
.drop("numStart", "numEnd")
.na.fill(Map("Flag" -> 0))
答案 1 :(得分:0)
您可以根据(i)中描述的条件,将dfB
与dfA
左连接,然后使用Flag
和{{1 }}函数将“默认”设置为0:
withColumn
记录的coalesce
值include
,根据您的要求,这些记录应得到dfB
,因此我们使用include=null
,如果为null,则返回默认值,并带有文字Flag=0
最后,摆脱您不感兴趣的coalesce
列:
lit(0)