欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

‘NoneType‘ object is not subscriptable报错

程序员文章站 2022-07-14 23:43:35
...

'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)

测试
‘NoneType‘ object is not subscriptable报错
Everything is OK!!
但是注册完udf函数调用后报错:
’NoneType’ object is not subscriptable
‘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]之间
‘NoneType‘ object is not subscriptable报错
2.在添加手机号合法性判断后,udf调用仍会出错,此时发现一合法手机号报错:
‘NoneType‘ object is not subscriptable报错
‘NoneType‘ object is not subscriptable报错
所以最终是库的完善问题而非各种格式问题。
因此最后放弃if else判断,改用try

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

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

相关标签: python 数据分析