Spark数据框:将条件列添加到数据框

时间:2019-04-08 20:39:26

标签: scala apache-spark dataframe apache-spark-sql conditional

我想将条件列Flag添加到数据帧A。满足以下两个条件时,将1添加到Flag,否则添加0:

    数据帧A中的
  1. num在数据帧B中的numStartnumEnd之间。

  2. 如果满足上述条件,请检查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         |
+----+------+-----+------------------------+----------+

2 个答案:

答案 0 :(得分:0)

在第一个条件下将两个数据框连接在一起,同时将所有行保留在数据框A中(即,通过左连接,请参见下面的代码)。联接之后,include列可以重命名为Flag,并且其中的所有NaN值都将设置为0。另外两个列numStartnumEnd将被删除。 / p>

因此,代码可以编写如下:

A.join(B, $"num" >= $"numStart" && $"num" <= $"numEnd", "left")
  .withColumnRenamed("include", "Flag")
  .drop("numStart", "numEnd")
  .na.fill(Map("Flag" -> 0))

答案 1 :(得分:0)

您可以根据(i)中描述的条件,将dfBdfA左连接,然后使用Flag和{{1 }}函数将“默认”设置为0:

  • 找到匹配项的记录将使用匹配的withColumn记录的coalesce
  • 没有匹配项的记录将有include,根据您的要求,这些记录应得到dfB,因此我们使用include=null,如果为null,则返回默认值,并带有文字Flag=0

最后,摆脱您不感兴趣的coalesce列:

lit(0)