PySpark中合并when子句内TYPE2与TYPE3条件的实现求助
没问题,我帮你把分散的条件合并成单条when语句,同时严格保留原代码的执行逻辑(Spark的when是按顺序匹配,第一个满足的条件会生效,这点很重要):
df2 = df1.withColumn( "DEVICETYPE", when(length(col("deviceid")) == 21, lit("type1")) # 合并TYPE2的两个触发条件,用逻辑或连接 .when(col("DEVICESERIALNO").like("1200125%") | length(col("deviceid")) == 17, lit("type2")) # 合并TYPE3的两个触发条件,用逻辑或连接 .when(col("DEVICESERIALNO").isNull() | length(col("deviceid")) == 17, lit("type3")) # 顺便把TYPE4的长度条件也简化了,和原逻辑完全一致 .when(length(col("deviceid")).isin(7, 5), lit("type4")) )
额外说明:
- 原代码里
length(col("deviceid")) ==17同时出现在TYPE2和TYPE3的条件中,但因为TYPE2的when排在TYPE3前面,所以当这个条件满足时会优先匹配TYPE2,TYPE3的该条件实际不会被触发,合并后这个逻辑完全保留 - 逻辑或也可以用更易读的
or()方法替代|,比如col("DEVICESERIALNO").like("1200125%").or(length(col("deviceid")) ==17),两种写法效果完全相同 - 如果你不习惯TYPE4的简化写法,也可以改回原来的两条
when语句,不影响功能
内容的提问来源于stack exchange,提问作者Ana
相关产品推荐
相关产品推荐

