首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >'TypeError:不支持解码str‘时,连接在udf中

'TypeError:不支持解码str‘时,连接在udf中
EN

Stack Overflow用户
提问于 2022-06-05 16:09:19
回答 2查看 56关注 0票数 0

我正在尝试创建一个简单的UDF,它连接两个字符串和一个分隔符。

代码语言:javascript
复制
def stringConcat(separator: str, first: str, second: str):
    return first + separator + second
spark.udf.register("stringConcat_udf", stringConcat)
customerDf.select("firstname", "lastname", stringConcat_udf(lit("-"),"firstname", 
"lastname")).show()

这是回溯:

从UDF中抛出一个异常:‘不支持TypeError:解码str’。全回溯 如下所示: TypeError:不支持解码str

这是怎么回事?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-06-05 18:14:49

首先,PySpark已经有了一个名为concat_ws (文档)的函数,它就是这样做的:

代码语言:javascript
复制
from pyspark.sql import functions as fn
customerDf.select("firstname", "lastname", fn.concat_ws("-","firstname", "lastname").alias("joined")).show()

但是,如果您仍然想要定义这个UDF,那么spark.udf.register("stringConcat_udf", stringConcat)就不会存储在任何地方,这意味着它在spark查询中是可用的,但是您需要定义它,以便与pyspark (文档)一起使用:

代码语言:javascript
复制
from pyspark.sql import functions as fn
from pyspark.sql.types import StringType
stringConcat_udf = fn.udf(stringConcat, StringType())
customerDf.select("firstname", "lastname", stringConcat_udf(fn.lit("-"),"firstname", "lastname").alias("joined")).show()
票数 2
EN

Stack Overflow用户

发布于 2022-06-05 18:12:22

注册UDF之后,您可以使用expr调用它。试试这个:

代码语言:javascript
复制
customerDf.select("firstname", "lastname", expr('stringConcat_udf("-", firstname, lastname)'))

这样做是可行的:

代码语言:javascript
复制
from pyspark.sql import functions as F
customerDf = spark.createDataFrame([('Tom', 'Hanks')], ["firstname", "lastname"])

def stringConcat(separator: str, first: str, second: str):
    return first + separator + second
spark.udf.register("stringConcat_udf", stringConcat)
df = customerDf.select("firstname", "lastname", F.expr('stringConcat_udf("-", firstname, lastname)'))
df.show()
# +---------+--------+----------------------------------------+
# |firstname|lastname|stringConcat_udf(-, firstname, lastname)|
# +---------+--------+----------------------------------------+
# |      Tom|   Hanks|                               Tom-Hanks|
# +---------+--------+----------------------------------------+
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72508999

复制
相关文章

相似问题

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