首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在条件定义上返回一个列,接受几个列作为输入

在条件定义上返回一个列,接受几个列作为输入
EN

Stack Overflow用户
提问于 2017-08-23 19:24:35
回答 2查看 2.6K关注 0票数 1

我使用的是Spark2.1,使用的是pyscripting

问题陈述:有一个场景,需要将多个列作为输入传递,然后返回一个列作为输出,这是我输入的3列的数据。

A、b、c

S S S

S NS

S NS S

S S NS

NS S

我的输出必须如下

a、b、c、d

S S

NS NS

S NS S

S S NS

NS S NS

我试图注册一个UDF来传递这3列a,b,c作为输入,并返回d列作为输出,在这里,a,b,c,d是列名。

我发现很难得到下面的输出是使用的语法

代码语言:javascript
复制
def return_string(x):
      if [x.a=='s' & x.b=='S' & x.c=='s']
          return 'S'
      else if[x.a=='s' & x.b=='NS' & x.c=='s']
          return 'S'
      else if[x.a=='s' & x.b=='S' & x.c=='NS']
          return 'NS;

func= udf(returnstring,types.StringType())

有谁能帮我完成这个逻辑吗。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-08-23 19:56:24

我试图使用内置的withColumnwhen函数来完成它:

代码语言:javascript
复制
from pyspark.sql.functions import col, when, lit

df.withColumn('d', when(
     ((col('A') == 'S') & (col('B') == 'S') & (col('C')=='S'))
   | ((col('A') == 'S') & (col('B') == 'NS') & (col('C')=='S'))
 , lit('S')
 ).otherwise(lit('NS'))
).show()

这也是假设这两个值是互斥的(因此otherwise)

票数 6
EN

Stack Overflow用户

发布于 2017-08-23 19:49:45

它应该是:

代码语言:javascript
复制
@udf
def return_string(a, b, c):
    if a == 's' and b == 'S' and c == 's':
        return 'S'
    if a == 's' and b == 'NS' and c == 's':
        return 'S'
    if a == 's' and b == 'S' and c == 'NS':
        return 'NS'

df = sc.parallelize([('s', 'S', 'NS'), ('?', '?', '?')]).toDF(['a', 'b', 'c'])

df.withColumn('result', return_string('a', 'b', 'c')).show()
## +---+---+---+------+
## |  a|  b|  c|result|
## +---+---+---+------+
## |  s|  S| NS|    NS|
## |  ?|  ?|  ?|  null|
## +---+---+---+------+
  • 应该列出所有参数(除非您将数据作为struct传递)。
  • 您应该使用and而不是& (您计算逻辑表达式而不是&表达式)。
  • 条件应该是表达式,而不是列表(非空列表总是真实的)。

就我个人而言,我会跳过所有的ifs并使用简单的dict

代码语言:javascript
复制
@udf
def return_string(a, b, c):
    mapping = {
        ('s', 'S', 's'): 'S',
        ('s', 'NS' 's'): 'S',
        ('s', 'S', 'NS'): 'NS',
    }
    return mapping.get((a, b, c))

根据您的要求调整条件。

总的来说,您应该更喜欢如Steven提供的the excellent answer中所示的SQL表达式(您可以使用when(..., ...).when(..., ...)链接多个条件)。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45847870

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档