‘NoneType‘ object is not subscriptable报错
程序员文章站
2022-07-14 23:43:35
...
背景
今天要做一个需求,根据明文手机号判断手机归属地:
使用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
推荐阅读
-
Vue报错:Uncaught TypeError: Cannot assign to read only property’exports‘ of object
-
使用xadmin更新数据时,报错expected string or bytes-like object
-
hibernate的报错信息a different object with the same identifier value was already associated with the session解决办法
-
numpy.savetxt() 报错 Mismatch between array dtype (‘object‘) and format specifier (‘%.18e‘)的解决方法
-
Vue报错:Uncaught TypeError: Cannot assign to read only property’exports‘ of object’#
-
tushare报错之解决(亲测有效):websocket._exceptions,ValueError: No ‘:‘ found when decoding object value
-
报错:libmysqlclient.so.18: cannot open shared object file: No such file or directory.
-
解决报错:TypeError: argument should be integer or bytes-like object, not ‘str‘
-
TypeError: the JSON object must be str, bytes or bytearray, not NoneType
-
“TypeError: 'dict_keys' object is not subscriptable”