Загрузка больших данных Twitter JSON (7 ГБ +) в Python

Я настроил публичный поток через AWS для сбора твитов и теперь хочу сделать предварительный анализ. Все мои данные хранились в корзине S3 (в файлах 5 Мб).

Я загрузил все и объединил все файлы в один. Каждый твит хранится как стандартный объект JSON в соответствии со спецификациями Twitter.

По сути, консолидированный файл содержит несколько объектов JSON. Я добавил открывающие и закрывающие квадратные скобки ([]), чтобы он выглядел как список словарей для чтения в Python. Таким образом, структура примерно такая (я не уверен, что смогу просто опубликовать здесь данные из твиттера):

[{"created_at":"Mon Sep 19 23:58:50 +000 2016", "id":<num>, "id_str":"<num>","text":"<tweet message>", etc.}, 
{same as above},
{same as above}]

После удаления самого первого твита я поместил все на www.jsonlint.com и подтвердил, что это действительная структура данных JSON.

Теперь я пытаюсь загрузить эти данные в Python и надеюсь выполнить некоторые базовые подсчеты различных терминов в твитах (например, сколько раз @HillaryClinton упоминается в тексте твита и т. Д.).

Ранее с меньшими наборами данных мне удавалось получить код, подобный этому:

import json
import csv
import io
data_json = open('fulldata.txt', 'r', encoding='utf-8')
data_python = json.load(data.json)

Затем я записал данные для соответствующих полей в файл CSV и выполнил свой анализ таким образом. Это работало для файла 2 ГБ.

Теперь, когда у меня есть 7 ГБ файл, я замечаю, что если я использую этот метод, Python выдает ошибку вСтрока «json.load (data.json)», в которой говорится «OSError: [Errno 22] Недопустимый аргумент.

Я не уверен, почему это происходит, но я ожидаю, что это может быть потому, что он пытается загрузить весь файл сразу в память. Это правильно?

Поэтому я пытался использовать ijson, который, по-видимому, позволяет вам анализировать файл json. Я пытался написать следующий код:

import ijson
f = open('fulldata.txt', 'r', encoding='utf-8')
content = ijson.items(f, 'item')
for item in content:
    <do stuff here>

С этой реализацией я получаю сообщение об ошибке «для элемента в содержимом», говоря: «ijson.backends.python.unexpectedsymbol: неожиданный символ '/ u201c' в 1

Я также попытался просмотреть каждую строку файла данных и просмотреть ее в формате строк JSON. Итак, предполагая, что каждая строка была объектом JSON, я написал:

raw_tweets = []
with open('full_data.txt', 'r', encoding='utf-8') as full_file:
     for line in full_file:
         raw_tweets.append(json.dumps(line))
print(len(raw_tweets)) #this worked. got like 2 million something as expected!
enter code here

Но здесь каждая запись в списке была строкой, а не словарем, что затрудняло анализ данных, которые мне были нужны. Есть ли способ изменить этот последний код, чтобы он работал так, как мне нужно? Но даже тогда, не будет ли загрузка всего этого набора данных в список усложнить дальнейший анализ с учетом ограничений памяти?

Я немного застрял в лучшем способе продолжить это. Я действительно хочу сделать это в Python, потому что я пытаюсь научиться использовать инструменты Python для такого рода анализов.

Есть ли у кого-нибудь опыт с этим? Я действительно тупой или неправильно понимаю что-то очень простое?

РЕДАКТИРОВАТЬ:

Итак, я сначала зашел на www.jsonlint.com и вставил весь свой набор данных и обнаружил, что после удаления первого твита он был в допустимом формате JSON. Так что пока я просто исключил этот файл.

В основном у меня есть набор данных в формате, упомянутом выше ([{json1}, {json2}], где каждая сущность в {} представляет твит.

Теперь, когда я подтвердил, что это действительный JSON, моя цель состояла в том, чтобы перевести его на python, чтобы каждый JSON был представлен в виде словаря (чтобы я мог легко манипулировать этими файлами).Может ли кто-нибудь исправить мой мыслительный процесс здесь, если он неэффективен?

Для этого я сделал:

raw_tweets=[]
with open('fulldata.txt', 'r', encoding='ISO-8859-1') as full_file:
     for line in full_file:
         raw_tweets.append(json.dumps(line))
#This successfully wrote each line of my file into a list. Confirmed by checking length, as described previously.
#Now I want to write this out to a csv file. 
csv_out = io.open("parsed_data.csv", mode = 'w', encoding='ISO-8859-1')
fields = u'created_at,text,screen_name,followers<friends,rt,fav'
csv_out.write(fields) #Write the column headers out. 
csv_out.write(u'\n')
#Now, iterate through the list. Get each JSON object as a dictionary and pull out the relevant information.
for tweet in raw_tweets:
#Each "tweet" is {json#},\n'
    current_tweet = json.loads(tweet) #right now everything is a list of strings in the {} format but it's just a string and not a dictionary. If I convert it to a JSON object, I should be able to make a dictionary form of the data right?
row = [current_tweet.get('created_at'), '"' + line.get('text').replace('"','""') + '"', line.get('user).get('screen_name')] #and I continue this for all relevant headers

Проблема в том, что последняя строка, где я говорю current_tweet.get, не работает, потому что она продолжает говорить, чтоУ 'str' нет атрибута 'get' поэтому я не уверен, почему json.loads () не дает мне словарь ...

EDIT # 2

Пользователь порекомендовал мне удалить [и], а также запятые, чтобы в каждой строке был допустимый JSON. Таким образом, я мог просто json.loads () каждой строки. Я снял скобки, как предложено. Для запятых я сделал это:

raw_tweets=[]
with open('fulldata.txt', 'r', encoding='ISO-8859-1') as full_file:
     for line in full_file:
         no_comma = line[:-2] #Printed this to confirm that final comma was removed
         raw_tweets.append(json.dumps(line))

Это дает ошибку, говоряОшибка значения: Ожидается ':' Разделитель: строка 1, столбец 2305 (символ 2304)

Чтобы отладить это, я напечатал первую строку (т.е. я только что сказал print (no_comma)) и заметил, что то, что напечатал Python, на самом деле содержало несколько твитов внутри ... Когда я открываю это в редакторе, таком как «UltraEdit», я замечаю, что каждый твит это четкая линия, поэтому яПредполагается, что каждый объект JSON был разделен символом новой строки, Но здесь, когда я печатаю результаты после итерации по линиям, я вижу, что он тянет сразу несколько твитов.

Должен ли я повторяться по-другому? Подходит ли мой метод удаления запятых или я должен предварительно обработать файл отдельно?

Я почти уверен, что мой JSON плохо отформатирован, но я не уверен, почему и как его исправить. Вот образец моих данных JSON. Если это не разрешено, я удалю это ...

https://ufile.io/47b1

Ответы на вопрос(2)

Ваш ответ на вопрос