在Spark中自动将json放入数据帧

时间:2019-07-26 08:04:11

标签: python json apache-spark pyspark apache-spark-sql

.gz文件中有多个json。我尝试将它们解析为rdds,然后解析为数据帧。我无法做到最好:

rdd =sc.textFile(path).map(json.loads).map(get_values)

其中的get_values函数是这样的:

def get_values(data): 
    try:
        time = data['time']
    except Exception:
        time = None
    try:
        place = data['data']['place']
    except Exception:
        place = None
return time, place

问题是几个json是不同的,其中一些包含几种类别,有些没有,并且很难手动编写此函数以使数据框包含所有键。 问题是:是否有任何方法/功能可以使这一过程自动化?

2 个答案:

答案 0 :(得分:1)

您可以使用以下方式读取json文件:

df = spark.read.json(path)

Spark会自动尝试推断模式,您可以使用

查看它
df.printSchema

如果您有多行json,请使用选项multiline = true

您可以在official documentation中了解有关使用Spark读取json文件的更多信息。


从Spark中的字符串解析json

作为一般建议,避免在Spark中从字符串中解析json,请避免使用mapjson.loads(或类似功能)。

Spark中已有一个更快的解决方案:from_json function

答案 1 :(得分:0)

由于您的输入data是字典,我想您可以使用此功能:

from functools import reduce

def get_values(data):
    values = data.values()
    while any([isinstance(value, dict) for value in values]):
        not_dicts = list(filter(lambda value: not isinstance(value, dict), values))
        dicts = list(filter(lambda value: isinstance(value, dict), values))
        values = not_dicts + reduce(lambda l1, l2: l1+l2, [dict_.values() for dict_ in dicts])
    return values

d = {1:1,
     2:2,
     3:{'a':4,
        'b': 5,
        'c': {'z': 6}
       }
    }
get_values(d)

[1, 2, 4, 5, 6]