Разбор твитов в формате json для поиска пользователей твитеров - PullRequest
0 голосов
/ 19 мая 2018

Я читаю канал твитера в формате json, чтобы узнать количество пользователей.Некоторые строки во входном файле могут быть не твитами, а сообщениями, которые сервер Twitter отправлял разработчику (например, уведомления об ограничениях).Мне нужно игнорировать эти сообщения.

Эти сообщения не будут содержать поле create_at и могут быть соответствующим образом отфильтрованы.

Я написал следующий фрагмент кода, чтобы извлечь действительные твиты, изатем извлеките user.id и текст.

def safe_parse(raw_json):
    try:
        json_object = json.loads(raw_json)
        if 'created_at' in json_object:
            return json_object
        else:
            return
    except ValueError as error:
        return

def get_usr_txt (line):
    tmp = safe_parse(line)
    if(tmp != None):
        return ((tmp.get('user').get('id_str'),tmp.get('text')))
    else:
        return

Моя задача состоит в том, чтобы я получил еще одного пользователя с именем "Нет"

Вот пример выходных данных (это большой файл)

('49838600', 'Это темперамент, который вы ищете в парне, который будет иметь доступ к нашему ядерному арсеналу.), Нет , (' 2678507624 ',' RT @GrlSmile: @ Ricky_Vaughn99 Да, которыйпочему в 1992 году я перешел от демократа к республиканцу, чтобы проголосовать за Пэт Бьюкенена, который предупреждал обо всех т… '),

Я изо всех сил пытаюсь выяснить, что я делаю неправильно.В файле твитера нет None, поэтому я предполагаю, что я читаю {"limit":{"track":1,"timestamp_ms":"1456249416070"}}, но приведенный выше код не должен включать его, если я что-то упустил.

Есть указатели?и спасибо за вашу помощь и ваше время.

1 Ответ

0 голосов
/ 19 мая 2018

Некоторые строки во входном файле могут быть не твитами, а сообщениями, которые сервер Twitter отправлял разработчику (например, уведомления об ограничениях).Мне нужно игнорировать эти сообщения.

Это не совсем то, что происходит.Если происходит одно из следующих действий:

  • raw_json не является допустимым документом JSON
  • created_at не находится в разобранном объекте.

вы вернетесь со значением по умолчанию None.Если вы хотите игнорировать их, вы можете добавить filter шаг между двумя операциями:

rdd.map(safe_parse).filter(lambda x: x).map(get_usr_txt)

Вы также можете использовать flatMap трюк, чтобы избежать filter и упростить ваш код (заимствовано из этот ответ от ноль323 ):

def safe_parse(raw_json):
    try:
        json_object = json.loads(raw_json)
    except ValueError as error:
        return []
    else:
        if 'created_at' in json_object:
            yield json_object

rdd.flatMap(safe_parse).map(get_usr_txt)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...