Python udf解析pyspark数据帧中的字符串json
我有一个pyspark数据框架,其中包含字符串json。如下所示:Python udf解析pyspark数据帧中的字符串json,python,json,apache-spark,dictionary,pyspark,Python,Json,Apache Spark,Dictionary,Pyspark,我有一个pyspark数据框架,其中包含字符串json。如下所示: +---------------------------------------------------------------------------+ |col | +----------------------------------------------------------
+---------------------------------------------------------------------------+
|col |
+---------------------------------------------------------------------------+
|{"fields":{"list1":[{"list2":[{"list3":[{"type":false}]}]}]}} |
+----------------------------------------------------------------------------+--
我编写UDF试图解析json,然后计算与phone匹配的值,并返回df中的一个新列
def item_count(json,type):
count=0
for i in json.get("fields",{}).get("list1",[]):
for j in i.get("list2",[]):
for k in j.get("list3",[]):
count+=k.get("type",None)==type
return count
def item_phone_count(json):
return item_count(json,False)
df2= df\
.withColumn('item_phone_count', (F.udf(lambda j: item_phone_count(json.loads(j)), t.StringType()))('col'))
但我得到了一个错误:
AttributeError: 'NoneType' object has no attribute 'get'
知道怎么回事吗?检查无,然后跳过这些条目:
def item_count(json,type):
count = 0
if (json is None) or (json.get("fields",{}) is None):
return count
for i in json.get("fields",{}).get("list1",[]):
if i is None:
continue
for j in i.get("list2",[]):
if j is None:
continue
for k in j.get("list3",[]):
if k is None:
continue
count += k.get("type",None) == type
return count
item\u count()
中的一个变量似乎是None
,但无法从您发布的信息中找出哪一个变量。请发布完整的错误回溯,并附上足够的信息,以便其他人可以重现您的错误。@craig您的意思是在i、j、k中,其中一个是无?这是您看到的错误的可能原因。尝试在循环中打印它们,看看其中一个是否为None
@Craig既然我正在从pyspark数据帧调用udf,如何打印它?@Kihhfuee尝试从您的数据帧中获取一些条目,并手动将它们放入函数中,看看发生了什么现在错误消失了,但不确定为什么我在检查数据帧时仍然得到0计数原始json,并且肯定存在与条件匹配的值。加载会改变类型的格式吗?我对这个问题做了一些编辑。类型值为false