Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在pyspark中创建具有两个输入的UDF

如何在pyspark中创建具有两个输入的UDF
EN

Stack Overflow用户
提问于 2017-07-11 08:21:13
回答 2查看 6.9K关注 0票数 1

我是pyspark的新手,我正在尝试创建一个简单的udf,它必须接受两个输入列,检查第二列是否有空格,如果有,将第一列拆分为两个值并覆盖原始列。这就是我所做的:

代码语言:javascript
运行
AI代码解释
复制
def split(x, y):
if x == "EXDRA" and y == "":
    return ("EXT", "DCHA")
if x == "EXIZQ" and y == "":
    return ("EXT", "IZDA")

udf_split = udf(split, ArrayType())

df = df \
.withColumn("x", udf_split(df['x'], df['y'])[1]) \
.withColumn("y", udf_split(df['x'], df['y'])[0])

但是当我运行这段代码时,我得到了以下错误:

代码语言:javascript
运行
AI代码解释
复制
File "<stdin>", line 1, in <module>
TypeError: __init__() takes at least 2 arguments (1 given)

我做错了什么?

谢谢你,阿尔瓦罗

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-07-11 09:17:03

我不确定你想要做什么,但根据我的理解,我会这样做:

代码语言:javascript
运行
AI代码解释
复制
from pyspark.sql.types import *
from pyspark.sql.functions import udf, col

def split(x, y):
    if x == "EXDRA" and y == "":
        return ("EXT", "DCHA")
    if x == "EXIZQ" and y == "":
        return ("EXT", "IZDA")

schema = StructType([StructField("x1", StringType(), False), StructField("y1", StringType(), False)])
udf_split = udf(split, schema)

df = spark.createDataFrame([("EXDRA", ""), ("EXIZQ", ""), ("", "foo")], ("x", "y"))

df.show()

# +-----+---+
# |    x|  y|
# +-----+---+
# |EXDRA|   |
# |EXIZQ|   |
# |     |foo|
# +-----+---+

df = df \
.withColumn("split", udf_split(df['x'], df['y'])) \
.withColumn("x", col("split.x1")) \
.withColumn("y", col("split.y1"))

df.printSchema()

# root
#  |-- x: string (nullable = true)
#  |-- y: string (nullable = true)
#  |-- split: struct (nullable = true)
#  |    |-- x1: string (nullable = false)
#  |    |-- y1: string (nullable = false)


df.show()

# +----+----+----------+
# |   x|   y|     split|
# +----+----+----------+
# | EXT|DCHA|[EXT,DCHA]|
# | EXT|IZDA|[EXT,IZDA]|
# |null|null|      null|
# +----+----+----------+
票数 3
EN

Stack Overflow用户

发布于 2019-10-16 21:09:56

我想你必须将你的udf定义为:

代码语言:javascript
运行
AI代码解释
复制
udf_split = udf(split, ArrayType(StringType()))
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45029113

复制
相关文章

相似问题

添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档