Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python udf解析pyspark数据帧中的字符串json_Python_Json_Apache Spark_Dictionary_Pyspark - Fatal编程技术网

Python udf解析pyspark数据帧中的字符串json

Python udf解析pyspark数据帧中的字符串json,python,json,apache-spark,dictionary,pyspark,Python,Json,Apache Spark,Dictionary,Pyspark,我有一个pyspark数据框架,其中包含字符串json。如下所示: +---------------------------------------------------------------------------+ |col | +----------------------------------------------------------

我有一个pyspark数据框架,其中包含字符串json。如下所示:

+---------------------------------------------------------------------------+
|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