.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是不同的,其中一些包含几种类别,有些没有,并且很难手动编写此函数以使数据框包含所有键。 问题是:是否有任何方法/功能可以使这一过程自动化?
答案 0 :(得分:1)
您可以使用以下方式读取json文件:
df = spark.read.json(path)
Spark会自动尝试推断模式,您可以使用
查看它df.printSchema
如果您有多行json,请使用选项multiline = true
。
您可以在official documentation中了解有关使用Spark读取json文件的更多信息。
作为一般建议,避免在Spark中从字符串中解析json,请避免使用map
和json.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]