Pyspark: AttributeError: объект dict не имеет атрибута lookup - PullRequest
1 голос
/ 22 апреля 2019

У меня есть СДР, верхние 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 Ответ

1 голос
/ 22 апреля 2019

Чтобы получить все значения для ключа 'release_date', просто используйте карту

dataset.map(lambda x: x.get('release_date')).take(2)
# Out:
# ['2011-01-11T10:26:12Z', '2010-04-08T04:14:23Z']

Используйте значение по умолчанию get('release_date', 'some_default_value') для строк с отсутствующей 'release_date'.

Tosort:

dataset.takeOrdered(2, key = lambda x: x.get('release_date'))

(но обратите внимание, что даты сравниваются как строки)

lookup() - это функция, которая может быть применена к СДР.Но в этом случае СДР содержит не ключ-значение, а словари.Один из способов использования 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, чтоявляется словарем и не имеет метода поиска.

...