‘NoneType‘ object is not subscriptable报错

'NoneType' object is not subscriptable报错

背景

今天要做一个需求,根据明文手机号判断手机归属地:
使用python内置phone包,完成udf函数然后spark调用
udf测试代码:

from phone import Phone

def phoneprovince(phonenum):
    phonenum = phonenum[-11:]
    info = Phone().find(phonenum)
    province = info['province']
    return(province)

测试

Everything is OK!!
但是注册完udf函数调用后报错:
’NoneType’ object is not subscriptable
在这里插入图片描述

想想可能是数据里面的空值导致,于是在SQL以及udf中均限制了不为空的条件
更改udf:

def phoneprovince(phonenum):
    if (phonenum == '' or phonenum == None):
        province = 'noprovince'
    else:
        phonenum = phonenum[-11:]
        info = Phone().find(phonenum)
        province = info['province']
    print(province) 

更改SQL:


tmp = spark.sql('''
SELECT DISTINCT *
FROM dmr_dev.rebind_mobile_through_card_0915
WHERE old_mobile IS NOT NULL
AND new_mobile IS NOT NULL
AND old_mobile <> ''
AND new_mobile <> ''
''').collect()

此时仍报错**‘NoneType’ object is not subscriptable**,自己检查了原始数据类型,均为String,并非空值导致问题。

问题定位

1.非法手机号导致报错:此处尝试使用123开头手机号,证明非法手机号确实是导致报错原因,故添加对手机号合法性判断:
以1开头,且第二位在[3-9]之间
在这里插入图片描述
2.在添加手机号合法性判断后,udf调用仍会出错,此时发现一合法手机号报错:
在这里插入图片描述
在这里插入图片描述
所以最终是库的完善问题而非各种格式问题。
因此最后放弃if else判断,改用try

整个下午都在想到底是哪里格式有问题,最后发现是自己太过死板。
Anyway,下午查了很多CSDN上关于这个报错的问题,目前没有发现是因为我这样的,所以写了这篇blog,纪念闹心的一个下午。

引用
[1]: https://www.cnblogs.com/yaoqian/p/9358107.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值