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

问题描述 投票:1回答:1

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

python-3.x pyspark rdd
1个回答
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,这是一个字典并且没有查找方法。

© www.soinside.com 2019 - 2024. All rights reserved.