PySpark 中的嵌套 if 等效项是什么?

问题描述 投票:0回答:1

我是 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”并保持另一个字段不变,因此查找会按预期执行并且不会含糊不清,根据我当前的代码,如果首先找到传入路径,它将丰富基于的值直接在上面,甚至不移动到传出路径代码

python pyspark bigdata
1个回答
0
投票

您可以尝试以下代码:

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|
+-------------+-------------+---------------+--------------------+
© www.soinside.com 2019 - 2024. All rights reserved.