Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/296.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 Pyspark-从json文件获取属性名称_Python_Apache Spark_Pyspark - Fatal编程技术网

Python Pyspark-从json文件获取属性名称

Python Pyspark-从json文件获取属性名称,python,apache-spark,pyspark,Python,Apache Spark,Pyspark,我是pyspark的新手。我的要求是从嵌套的json文件中获取/提取属性名称。我尝试使用从pandas包导入的json_normalize。它适用于直接属性,但从不获取json数组属性中的属性。我的json没有静态结构。我们收到的每一份文件都会有所不同。有人能帮我解释一下下面的小例子吗 { "id":"1", "name":"a", "salaries":[

我是pyspark的新手。我的要求是从嵌套的json文件中获取/提取属性名称。我尝试使用从pandas包导入的json_normalize。它适用于直接属性,但从不获取json数组属性中的属性。我的json没有静态结构。我们收到的每一份文件都会有所不同。有人能帮我解释一下下面的小例子吗

        {  
               "id":"1",
               "name":"a",
               "salaries":[  
                  {  
                     "salary":"1000"
                  },
                  {  
                     "salary":"5000"
                  }
               ],
               "states":{  
                  "state":"Karnataka",
                  "cities":[  
                     {  
                        "city":"Bangalore"
                     },
                     {  
                        "city":"Mysore"
                     }
                  ],
                  "state":"Tamil Nadu",
                  "cities":[  
                     {  
                        "city":"Chennai"
                     },
                     {  
                        "city":"Coimbatore"
                     }
                  ]
               }
            }  
特别是对于json数组元素

预期产出: 身份证件 名称 薪水 州
states.cities.city`

如果您将json视为python字典,那么这应该是可行的

我刚刚写了一个简单的递归程序

脚本

import json

def js_r(filename):
    with open(filename) as f_in:
        return(json.load(f_in))

g = js_r("city.json")
answer_d = {}
def base_line(g, answer_d):
    for key in g.keys():
        answer_d[key] = {}
    return answer_d

answer_d = base_line(g, answer_d)
def recurser_func(g, answer_d):
    for k in g.keys():
        if type(g[k]) == type([]): #If the value is a list
            answer_d[k] = {list(g[k][0].keys())[0]:{}}

        if type(g[k]) == type({}): #If the value is a dictionary
            answer_d[k] = {list(g[k].keys())[0]: {}} #set key equal to 
            answer_d[k] = recurser_func(g[k], answer_d[k])
    return answer_d
recurser_func(g,answer_d)


def printer_func(answer_d, list_to_print, parent):
    for k in answer_d.keys():
        if len(answer_d[k].keys()) == 1:
            list_to_print.append(parent)
            list_to_print[-1] += k
            list_to_print[-1] += "." + str(list(answer_d[k].keys())[0])
        if len(answer_d[k].keys()) == 0:
            list_to_print.append(parent)
            list_to_print[-1] += k
        if len(answer_d[k].keys()) > 1:
            printer_func(answer_d[k], list_to_print, k + ".")
    return list_to_print



l = printer_func(answer_d, [], "")
final = " ".join(l)
print(final)
解释

base\u line
制作一本包含所有基本键的字典

recursur\u func
检查键的值是列表还是dict,然后根据需要添加到应答字典中,直到
answer\u d
看起来像:
{'id':{},'name':{},'salary':{},'salary':{},'state':{},'cities':{'city':{}}}

在调用这两个函数之后,就有了某种意义上的键字典。那么printer_func是一个递归函数,可以根据需要打印它

注意:

您的问题与此类似:但由于您有一个嵌套的列表/词典,而不仅仅是一个嵌套的词典,因此它们的答案对您不起作用,但如果您希望了解更多信息,则会有更多关于该问题的讨论

编辑1

我的python版本是3.7.1

我在顶部添加了一个json文件开启器。我假设json名为city.json,并且位于同一目录中

编辑2:更全面的解释

我发现处理数据的主要困难是,可以有无限嵌套的列表和字典。这使它变得复杂。由于嵌套是无限可能的,我认为这是一个递归问题

因此,我构建了一个字典字典,它表示您正在寻找的密钥结构。首先,我从基线开始

base_line
make
{'id':{},'name':{},'salaries':{},'states':{}
这是一个空字典字典的字典。我知道当你打印的时候。每个关键字结构(如
states.state
)都以其中一个单词开头

递归

然后我使用
recursur\u func
添加所有子键。 当给定一个字典
g
时,此函数用于循环该字典中的所有键,并且(假设
answer\u d
具有
g
所具有的每个键),每个键将添加该键子项以进行应答


如果孩子是一本字典。然后我递归给定的字典
g
现在是字典中属于子类的子部分,而answer\u d是answer\u d中属于子类的子部分。

下面是从json中提取所有嵌套属性的另一个解决方案

import json

result_set = set([])


def parse_json_array(json_obj, parent_path):
    array_obj = list(json_obj)
    for i in range(0, len(array_obj)):
        json_ob = array_obj[i]
        if type(json_obj) == type(json_obj):
            parse_json(json_ob, parent_path)
    return None


def parse_json(json_obj, parent_path):
    for key in json_obj.keys():
        key_value = json_obj.get(key)
        # if isinstance(a, dict):
        if type(key_value) == type(json_obj):
            parse_json(key_value, str(key) if parent_path == "" else parent_path + "." + str(key))
        elif type(key_value) == type(list(json_obj)):
            parse_json_array(key_value, str(key) if parent_path == "" else parent_path + "." + str(key))
        result_set.add((parent_path + "." + key).encode('ascii', 'ignore'))
    return None



file_name = "C:/input/sample.json"
file_data = open(file_name, "r")
json_data = json.load(file_data)
print json_data

parse_json(json_data, "")
print list(result_set)
输出:

{u'states': {u'state': u'Tamil Nadu', u'cities': [{u'city': u'Chennai'}, {u'city': u'Coimbatore'}]}, u'id': u'1', u'salaries': [{u'salary': u'1000'}, {u'salary': u'5000'}], u'name': u'a'}
['states.cities.city', 'states.cities', '.id', 'states.state', 'salaries.salary', '.salaries', '.states', '.name']
注:

My Python version: 2.7 

你也可以这样做

data = { "id":"1", "name":"a", "salaries":[ { "salary":"1000" }, { "salary":"5000" } ], "states":{ "state":"Karnataka", "cities":[ { "city":"Bangalore" }, { "city":"Mysore" } ], "state":"Tamil Nadu", "cities":[ { "city":"Chennai" }, { "city":"Coimbatore" } ] } }



def dict_ittr(lin,data):

    for k, v in data.items():
        if type(v)is list:
            for l in v:
               dict_ittr(lin+"."+k,l)
        elif type(v)is dict:
            dict_ittr(lin+"."+k,v)
            pass
        else:
            print lin+"."+k

dict_ittr("",data)
输出

.states.state
.states.cities.city
.states.cities.city
.id
.salaries.salary
.salaries.salary
.name

谢谢你的解释。如果我在一个文件中存储相同的json内容(如.json),我会得到以下错误,答案是_d[k]={list(g[k][0].keys())[0]:{}}}AttributeError:'str'对象没有属性'keys'。我发现这里的代码有点难以理解。检查列表的原因是为了找到json数组。。再次感谢你的帮助!!