我是 pySpark 的初学者,我正在努力丰富一个数据框,该数据框从其他 2 个数据框执行查找,我想要实现的是: 这是一个例子:
传入路径 | 传出路径 | 事件方向 | 其他_字段 |
---|---|---|---|
A | 不适用 | 我 | 使用传入路径查找并丰富数据框 |
不适用 | B | O | 使用传出路径查找并丰富数据框 |
C | D | TI(考虑一次传入_node以丰富并复制下面的完整记录) | |
C | D | TO(将重复记录视为传出节点以丰富数据帧) |
我在这里想要实现的是,如果传入_路径和传出_路径都不是空值,那么我们首先复制整个当前记录,然后在第一个记录lit(TI)的事件方向中,并根据传入_路径执行所有查找和丰富,然后在重复的记录 lit(TO) 中并根据传出路径执行所有查找和丰富
我当前的代码如下所示,
# EVENT_DIRECTION
table1_parsed_df = table1_parsed_df.withColumn('event_direction',
when((col("incoming_path") != 'NA') & (col("outgoing_path") != 'NA'), lit("T"))
.when(col("incoming_path") != 'NA', lit("I"))
.when(col("outgoing_path") != 'NA', lit("O"))
.otherwise(lit("E")))
我还写了一个函数将记录分成两部分:
def process_split_logic(df):
both_present = df.filter((col("incoming_node") != 'NA') & (col("outgoing_node") != 'NA'))
duplicated_records = both_present.select(
lit('NA').alias("incoming_node"),
col("outgoing_node").alias("outgoing_node"),
*[col(c) for c in df.columns if c not in ["incoming_node", "outgoing_node"]]
)
original_records = df.withColumn(
"outgoing_node",
when((col("incoming_node") != 'NA') & (col("outgoing_node") != 'NA'), lit('NA')).otherwise(col("outgoing_node"))
)
combined_df = original_records.union(duplicated_records)
return combined_df
使用这段代码,我目前可以将记录分成两部分并执行查找,但我不知道如何实现条件if嵌套,where,如果incoming_path和outgoing_path都不是NA我想输入条件子句为一条记录写入 TI,为一条记录写入 TO,并执行这些查找。我目前正在继续将一个字段设置为“NA”并保持另一个字段不变,因此查找会按预期执行并且不会含糊不清,根据我当前的代码,如果首先找到传入路径,它将丰富基于的值直接在上面,甚至不移动到传出路径代码
您可以尝试以下代码:
df=df.withColumn("event_direction",when(((col("incoming_path").isNotNull()) & (col("outgoing_path").isNotNull())),array(lit("TI"),lit("TO")))\
.when(col("incoming_path").isNotNull(),array(lit("I")))\
.when(col("outgoing_path").isNotNull(),array(lit("O"))))
df=df.withColumn("event_direction",explode(col("event_direction")))
df.show()
它将创建如下所示的输出。然后您可以使用它进行查找
|incoming_path|outgoing_path|event_direction| Other_fields|
+-------------+-------------+---------------+--------------------+
| A| NULL| I|Lookup with incom...|
| NULL| B| O|Lookup with outgo...|
| C| D| TI| NULL|
| C| D| TO| NULL|
+-------------+-------------+---------------+--------------------+