python中固有函数要定义吗_Pyspark:如何处理python用户定义函数中的空值

我想使用一些不是pyspark固有的字符串相似性函数,比如数据帧上的jaro和jaro winkler度量。这些在python模块中很容易获得,比如jellyfish。我可以为没有null值的情况编写pyspark udf's fine,即比较猫和狗。当我将这些udf应用于存在null值的数据时,它不起作用。在像我正在解决的问题中,其中一个字符串是null是非常常见的

我需要帮助使我的字符串相似性udf正常工作,更具体地说,在其中一个值是null的情况下工作

我编写了一个udf,当输入数据中没有空值时,它可以工作:from pyspark.sql.functions import udf

from pyspark.sql.types import DoubleType

import pyspark.sql.functions as F

import jellyfish.cjellyfish

def jaro_winkler_func(df, column_left, column_right):

jaro_winkler_udf = udf(f=lambda s1, s2: jellyfish.jaro_winkler(s1, s2), returnType=DoubleType())

df = (df

.withColumn('test',

jaro_winkler_udf(df[column_left], df[column_right])))

return df

输入和输出示例:

^{pr2}$

+-----------+------------+------------------+

|string_left|string_right| test|

+-----------+------------+------------------+

| dude| dud|0.9166666666666666|

| spud| dud|0.7222222222222222|

+-----------+------------+------------------+

当我在一个空值的数据上运行这个函数时,我会得到大量的spark错误,最适用的似乎是TypeError: str argument expected。我假设这是由于数据中的null值造成的,因为它在没有值时起作用。在

我修改了上面的函数来检查两个值是否都不为null,并且只有在这种情况下才运行函数,否则返回0。在from pyspark.sql.functions import udf

from pyspark.sql.types import DoubleType

import pyspark.sql.functions as F

import jellyfish.cjellyfish

def jaro_winkler_func(df, column_left, column_right):

jaro_winkler_udf = udf(f=lambda s1, s2: jellyfish.jaro_winkler(s1, s2), returnType=DoubleType())

df = (df

.withColumn('test',

F.when(df[column_left].isNotNull() & df[column_right].isNotNull(),

jaro_winkler_udf(df[column_left], df[column_right]))

.otherwise(0.0)))

return df

但是,我仍然得到了和以前一样的错误。在

示例输入和我希望输出的内容:+-----------+------------+

|string_left|string_right|

+-----------+------------+

| dude| dud|

| spud| dud|

| spud| null|

| null| null|

+-----------+------------++-----------+------------+------------------+

|string_left|string_right| test|

+-----------+------------+------------------+

| dude| dud|0.9166666666666666|

| spud| dud|0.7222222222222222|

| spud| null|0.0 |

| null| null|0.0 |

+-----------+------------+------------------+

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值