我有一个RDD,其前2个元素如上所述:
dataset_json = sc.textFile("data/my_data.json")
dataset = dataset_json.map(lambda x: json.loads(x))
dataset.persist()
dataset.take(2)
输出:
[{'movie': 'movie_name1',
'release_date': '2011-01-11T10:26:12Z',
'actor': 'actor_name1'},
{'movie': 'movie_name2',
'release_date': '2010-04-08T04:14:23Z',
'actor': 'actor_name2'}]
我想隔离与发行日期相关的值,但是下面的行返回:
AttributeError:“ dict”对象没有属性“ lookup”
dataset2 = dataset.filter(lambda line: line.lookup('release_date'))
dataset2.first()
如果我尝试使用以下代码来标识密钥,则输出将返回完整的数据集,而不是仅返回密钥:
attributes = dataset.filter (lambda x: x.keys())
attributes.take(2)
它再次返回完整的数据集作为输出,而不仅仅是键:
[{'movie': 'movie_name1',
'release_date': '2011-01-11T10:26:12Z',
'actor': 'actor_name1'},
{'movie': 'movie_name2',
'release_date': '2010-04-08T04:14:23Z',
'actor': 'actor_name2'}]
有人可以向我解释为什么上面的代码不起作用以及如何隔离release_date吗? (此练习的最终目的是找到最早的发布日期)。 谢谢!
答案 0 :(得分:1)
要获取键“ release_date”的所有值,只需使用地图
dataset.map(lambda x: x.get('release_date')).take(2)
# Out:
# ['2011-01-11T10:26:12Z', '2010-04-08T04:14:23Z']
对于缺少“ release_date”的行,请使用默认值get('release_date', 'some_default_value')
。
排序:
dataset.takeOrdered(2, key = lambda x: x.get('release_date'))
(但请注意,日期将作为字符串进行比较)
lookup()
是可以应用于RDD的功能。但是在这种情况下,RDD不包含键值而是字典。使用lookup
的一种方法是将RDD展平并使其成为键值对RDD
dataset.flatMap(lambda x: x.items()).lookup('release_date').take(2)
# Out:
# ['2011-01-11T10:26:12Z', '2010-04-08T04:14:23Z']
在您的示例中,您试图将lookup
应用于line
,这是一个字典,没有查找方法。