I have the following pySpark dataframe:
+------------------+------------------+--------------------+--------------+-------+
| col1| col2| col3| X| Y|
+------------------+------------------+--------------------+--------------+-------+
|2.1729247374294496| 3.558069532647046| 6.607603368496324| 1| null|
|0.2654841575294071|1.2633077949463256|0.023578679968183733| 0| null|
|0.4253301781296708|3.4566490739823483| 0.11711202266039554| 3| null|
| 2.608497168338446| 3.529397129549324| 0.373034222141551| 2| null|
+------------------+------------------+--------------------+--------------+-------+
这是一个相当简单的操作,我可以轻松使用pandas完成。但是,我需要仅使用pySpark来完成它。
我想做以下操作(我会写成伪代码):
在col3 == max(col3)的行中,将Y从null更改为'K'
在其余的行中,在col1 == max(col1)的行中,将Y从null更改为'Z'
在其余的行中,在col1 == min(col1)的行中,将Y从null更改为'U'
在其余的行中:将Y从null更改为'I'。
因此,期望的输出是:
+------------------+------------------+--------------------+--------------+-------+
| col1| col2| col3| X| Y|
+------------------+------------------+--------------------+--------------+-------+
|2.1729247374294496| 3.558069532647046| 6.607603368496324| 1| K|
|0.2654841575294071|1.2633077949463256|0.023578679968183733| 0| U|
|0.4253301781296708|3.4566490739823483| 0.11711202266039554| 3| I|
| 2.608497168338446| 3.529397129549324| 0.373034222141551| 2| Z|
+------------------+------------------+--------------------+--------------+-------+
完成上述操作后,我需要将此表作为另一个表的查找表使用:
+--------------------+--------+-----+------------------+--------------+------------+
| x1| x2| x3| x4| X| d|
+--------------------+--------+-----+------------------+--------------+------------+
|0057f68a-6330-42a...| 2876| 30| 5.989999771118164| 0| 20171219|
|05cc0191-4ee4-412...| 108381| 34|24.979999542236328| 3| 20171219|
|06f353af-e9d3-4d0...| 118798| 34| 0.0| 3| 20171219|
|0c69b607-112b-4f3...| 20993| 34| 0.0| 0| 20171219|
|0d1b52ba-1502-4ff...| 23817| 34| 0.0| 0| 20171219|
我想使用第一个表作为查找表,在第二个表中创建一个新列。 新列的值应该使用第二个表中的X列作为键,查找第一个表中的Y列中对应于第一个表中的X列的值(因此我们查找第一个表中与第二个表中的X列对应的Y列中的值,并且这些值来自第二个表中的X列)。
更新:我需要一个能够处理一行满足两个条件的鲁棒解决方案,例如:
+------------------+------------------+--------------------+--------------+-------+
| col1| col2| col3| X| Y|
+------------------+------------------+--------------------+--------------+-------+
| 2.608497168338446| 3.558069532647046| 6.607603368496324| 1| null|
|0.2654841575294071|1.2633077949463256|0.023578679968183733| 0| null|
|0.4253301781296708|3.4566490739823483| 0.11711202266039554| 3| null|
|2.1729247374294496| 3.529397129549324| 0.373034222141551| 2| null|
+------------------+------------------+--------------------+--------------+-------+
在这种情况下,第0行同时满足'max('col3')'和'max('col1')'条件。
因此需要执行以下操作:
第0行变成'K'
第3行变成'Z'(因为在剩余的行中(0已经有了'K',所以第3行符合'max('col1')'条件)
第1行变成'U'
第2行变成'I'
在表格1中不能有多个包含'I'的行。