【发布时间】:2018-11-08 19:58:29
【问题描述】:
我在pyspark 中有一个如下所示的数据框。
+--------------------+--------------+------------+-----------+-----------+-----------+-----------+
| serial_number | rest_id | value | body | legs | face | idle |
+--------------------+--------------+------------+-----------+-----------+-----------+-----------+
| sn11 | rs1 | N | Y | N | N | acde |
| sn1 | rs1 | N | Y | N | N | den |
| sn1 | null | Y | N | Y | N | can |
| sn2 | rs2 | Y | Y | N | N | aeg |
| null | rs2 | N | Y | N | Y | ueg |
+--------------------+--------------+------------+-----------+-----------+-----------+-----------+
现在我想update一些列,同时检查一些列值。
当任何给定的serial_number 或rest_id 具有值Y 时,我想更新value,然后该特定serial_number 或rest_id 的所有values 应更新为Y。如果不是那么他们有什么价值观。
我已经完成了如下操作。
df.alias('a').join(df.filter(col('value')='Y').alias('b'),on=(col('a.serial_number') == col('b.serial_number')) | (col('a.rest_id') == col('b.rest_id')), how='left').withColumn('final_value',when(col('b.value').isNull(), col('a.value')).otherwise(col('b.value'))).select('a.serial_number','a.rest_id','a.body', 'a.legs', 'a.face', 'a.idle', 'final_val')
我得到了我想要的结果。
现在我想对 body、legs 和 face 列重复相同的操作。
我可以对所有列 individually 执行上述操作,我的意思是说 3 加入语句。但我想在一条语句中更新所有 4 列。
我该怎么做?
Expected result
+--------------------+--------------+------------+-----------+-----------+-----------+-----------+
| serial_number | rest_id | value | body | legs | face | idle |
+--------------------+--------------+------------+-----------+-----------+-----------+-----------+
| sn11 | rs1 | N | Y | N | N | acde |
| sn1 | rs1 | Y | Y | Y | N | den |
| sn1 | null | Y | Y | Y | N | can |
| sn2 | rs2 | Y | Y | N | Y | aeg |
| null | rs2 | Y | Y | N | Y | ueg |
+--------------------+--------------+------------+-----------+-----------+-----------+-----------+
【问题讨论】:
-
@Ramesh Maharjan 没有序列号不同
-
@Ramesh Maharjan 看起来 OP 搞错了
-
@user9367133 实际上我犯了错误;)当我解决它时我想通了
标签: python apache-spark pyspark