【问题标题】:pyspark dataframe when and multiple otherwise clausepyspark dataframe when 和 multiple else 子句
【发布时间】:2019-08-16 03:47:59
【问题描述】:

我需要在 pyspark 数据框中创建一个 if multiple else。

我有两列要进行逻辑测试。

逻辑如下:

  1. 如果 A 列 OR B 列包含“某物”,则写“X”
  2. Else If (A 列字符串中的数值 + B 列字符串中的数值) > 100 ,则写“X”
  3. Else If (A 列字符串中的数值 + B 列字符串中的数值) > 50 ,则写“Y”
  4. Else If (A 列字符串中的数值 + B 列字符串中的数值) > 0 ,则写“Z”
  5. 否则,写“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"))))))

Desired Output

【问题讨论】:

  • 不要做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


【解决方案1】:

我还是得到了解决方案。

df = df.withColumn('RESULT',\
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")))))

【讨论】:

  • 您可以通过比较两种方法的执行计划 (df.explain()) 向自己证明这等效于 when().when().when().otherwise()。你会发现它们是相同的。
  • @pault 感谢您的指导;我将尝试 when().when().when().otherwise() 的性能,无论它们的性能是否相同,我都会告诉你结果。
猜你喜欢
  • 1970-01-01
  • 2022-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-04
  • 1970-01-01
  • 1970-01-01
  • 2018-03-20
相关资源
最近更新 更多