Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
pyspark dataframe when和multiple Others子句_Pyspark_Apache Spark Sql_Pyspark Sql - Fatal编程技术网

pyspark dataframe when和multiple Others子句

pyspark dataframe when和multiple Others子句,pyspark,apache-spark-sql,pyspark-sql,Pyspark,Apache Spark Sql,Pyspark Sql,我需要在pyspark数据帧中创建if multiple-else 我有两列需要进行逻辑测试 逻辑如下: 如果A列或B列包含“某物”,则写“X” 否则,如果(a列字符串中的数值+B列字符串中的数值)>100,则写“X” 否则,如果(a列字符串中的数值+B列字符串中的数值)>50,则写入“Y” 否则,如果(a列字符串中的数值+B列字符串中的数值)>0,则写入“Z” 否则,写“T” 添加到新列“结果” 我认为最快的搜索方法是when,Others,Others,Others,Others,并在下面的

我需要在pyspark数据帧中创建if multiple-else

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

逻辑如下:

  • 如果A列或B列包含“某物”,则写“X”
  • 否则,如果(a列字符串中的数值+B列字符串中的数值)>100,则写“X”
  • 否则,如果(a列字符串中的数值+B列字符串中的数值)>50,则写入“Y”
  • 否则,如果(a列字符串中的数值+B列字符串中的数值)>0,则写入“Z”
  • 否则,写“T”
  • 添加到新列“结果”

    我认为最快的搜索方法是when,Others,Others,Others,Others,并在下面的查询中失败

    如果你能建议一种更快的方法,我将不胜感激

    注意:when(子句)。when(子句)。when(子句)。when(子句)。否则(子句)会一次又一次地搜索整个表。我只想处理不匹配的数据

    df=df.withColumn('RESULT',F.when(\
    F.when((F.col(“A”)like(“%something%”)F.col(“B”)like(“%something%”),X”)。否则(\
    当(((F.regexp_extract(F.col(“A”),“(\d+”,1))+F.regexp_extract(F.col(“B”),“(\d+”,1))>100),“X”)。否则(\
    当(((F.regexp_extract(F.col(“A”),“(\d+”,1))+F.regexp_extract(F.col(“B”),“(\d+”,1))>29),“Y”)。否则(\
    F.当(((F.regexp_extract(F.col(“A”),“(\d+”,1))+F.regexp_extract(F.col(“B”),“(\d+”,1))>0),“Z”)。否则(\
    "T"()()())
    

    反正我找到了解决办法

    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 = 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")))))
    

    不要在(条件1,…)时执行
    。否则(条件2,…)。否则(条件3,…)
    。正确的方法是执行
    .when(condition1,…).when(condition2,…).when(condition3,…).others()
    可能重复的@pault-when().when().others()一次又一次地搜索整个表。我希望每次都处理剩余的不匹配数据。when()。when()。when()。否则()会一遍又一遍地搜索整个表-此声明不正确。这相当于if elif elif else(如果你认为我错了,请给我看文档)@pault我找不到任何文档,而是说它更慢或更快,但我以前测试过一些查询,发现有一点显著的差异。不要在(条件1,…)时执行
    。否则(条件2,…)。否则(条件3,…)
    。正确的方法是执行
    .when(condition1,…).when(condition2,…).when(condition3,…).others()
    可能重复的@pault-when().when().others()一次又一次地搜索整个表。我希望每次都处理剩余的不匹配数据。when()。when()。when()。否则()会一遍又一遍地搜索整个表-此声明不正确。这相当于if elif elif else(如果你认为我错了,请给我看文档)@pault我找不到任何文档,而是说它更慢或更快,但我之前测试了一些查询,发现了一个稍微显著的差异。你可以向自己证明,这相当于
    when().when().when().other()
    比较两种方法的执行计划(
    df.explain()
    )。你会发现它们是一样的。@pault谢谢你的指导;我将尝试when().when().when().Others()性能,并让您知道它们的性能是否相同。通过比较两种方法的执行计划(
    df.explain()
    ),您可以向自己证明这等同于
    when().when().Others()
    )。你会发现它们是一样的。@pault谢谢你的指导;我将尝试when().when().when().others()性能,并将让您知道它们的性能是否相同。