【发布时间】:2019-08-16 03:47:59
【问题描述】:
我需要在 pyspark 数据框中创建一个 if multiple else。
我有两列要进行逻辑测试。
逻辑如下:
- 如果 A 列 OR B 列包含“某物”,则写“X”
- Else If (A 列字符串中的数值 + B 列字符串中的数值) > 100 ,则写“X”
- Else If (A 列字符串中的数值 + B 列字符串中的数值) > 50 ,则写“Y”
- Else If (A 列字符串中的数值 + B 列字符串中的数值) > 0 ,则写“Z”
- 否则,写“T”
到一个新列“结果”
我认为最快的搜索方法是when, else, else, else, else 并且在下面的查询中失败了。
如果您为此建议一种更快的方法,我们将不胜感激。
注意:when(clause).when(clause).when(clause).when(clause).otherwise(clause) 一次又一次地搜索整个表。我只想处理不匹配的数据。
df = df.withColumn('RESULT', F.when(\
F.when((F.col("A").like("%something%") | F.col("B").like("%something%")), "X").otherwise(\
F.when((((F.regexp_extract(F.col("A"), ".(\d+).", 1)) + F.regexp_extract(F.col("B"), ".(\d+).", 1)) > 100), "X").otherwise(\
F.when((((F.regexp_extract(F.col("A"), ".(\d+).", 1)) + F.regexp_extract(F.col("B"), ".(\d+).", 1)) > 29), "Y").otherwise(\
F.when((((F.regexp_extract(F.col("A"), ".(\d+).", 1)) + F.regexp_extract(F.col("B"), ".(\d+).", 1)) > 0), "Z").otherwise(\
"T"))))))
【问题讨论】:
-
不要做
when(condition1, ...).otherwise(when(condition2, ...).otherwise(when(condition3, ...)))。正确的做法是.when(condition1, ...).when(condition2, ...).when(condition3, ...).otherwise() -
@pault when().when().when().otherwise() 一遍又一遍地搜索整个表。我想每次都处理剩余的不匹配数据。
-
when().when().when().otherwise() 一遍又一遍地搜索整个表格 - 这种说法是不正确的。它相当于 if-elif-elif-else(如果您认为我错了,请给我看文档)
-
@pault 我找不到任何文档,而是说它更慢或更快,但我之前测试了几个查询,发现略有显着差异。
标签: pyspark apache-spark-sql pyspark-sql