Pyspark:AttributeError:'dict'对象没有属性'lookup'

时间:2019-04-22 11:36:14

标签: python-3.x pyspark rdd

我有一个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吗? (此练习的最终目的是找到最早的发布日期)。 谢谢!

1 个答案:

答案 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,这是一个字典,没有查找方法。