← Все курсы · Курс SQL

Как обрабатывать большие наборы данных

Если файл слишком велик для Excel · Вместо этого используйте базу данных · Часть Analyst Prep Kit

К , аналитик данных · Обновлено

Вы дважды щелкаете файл данных, и Excel вращается, зависает или сообщает, что не может его открыть. Реальные наборы данных часто намного больше, чем может вместить электронная таблица, и каждый новичок упирается в эту стену, когда впервые берет серьезный набор данных. Это руководство о том, что делать дальше. В нем рассказывается, как распознать «большой» набор данных и почему вы перемещаете его в базу данных. Затем он перечисляет несколько реальных причуд, которые сбивают с толку всех на пути.

Новичок в базах данных? В этом руководстве предполагается, что вы можете создать базу данных SQLite и импортировать CSV. Если вы еще этого не сделали, начните с Как настроить базу данных SQL (около 15 минут), затем возвращайтесь сюда.
Что вы узнаете
  1. Что на самом деле считается «большим»
  2. Почему база данных здесь лучше электронной таблицы
  3. Особенность загрузки: она поставляется в заархивированном виде.
  4. Импорт больших файлов (терпение и дисковое пространство)
  5. Единственный шаг, который ускоряет большие запросы: индекс
  6. Сначала пробуйте, затем запускайте все
  7. Агрегируйте заранее и проверяйте типы данных

Во-первых: что считать «большим»?

Поставьте на нем номер, прежде чем читать список. Сколько строк должно быть в файле, прежде чем электронная таблица перестанет быть подходящим инструментом? Ваша догадка, вероятно, слишком высока, и полезно знать, в каком направлении вы ошиблись.

«Большой» — это не вайб, у него реальные пороги. Набор данных достаточно велик, чтобы использовать это руководство, если любое из следующих условий верно:

Рабочий пример в этом руководстве — реальный: общедоступный набор данных обзоров игр Пар. recommendations.csv, примерно 2 ГБ и 41 миллион строк. Эксель не открывает. База данных справится с этим, не моргнув.

Шаг 1. Переместите данные в базу данных, а не в электронную таблицу.

Самый важный шаг: перестаньте пытаться открыть большие данные в электронной таблице. Вместо этого поместите его в базу данных. SQLite (через бесплатное приложение Браузер БД) не имеет практического ограничения на количество строк. Тот же файл, который привел к сбою Excel, становится таблицей, к которой можно обратиться за считанные секунды.

Это именно то создать, импортировать, проверить рабочий процесс из Руководство по базе данных SQL. Шаги идентичны для большого файла. Просто это займет больше времени, и именно к этому вас готовит остальная часть этого руководства.

Шаг 2. Ожидайте, что загрузка будет заархивирована (с дополнительными функциями, которые вам не нужны)

Большие общедоступные наборы данных почти никогда не загружаются в виде одного чистого CSV. Они приходят как .zip (часто называют чем-то общим, например archive.zip), который содержит несколько файлов, объединенных вместе. В нашем примере в застежка-молнияархиве содержалось четыре файла, а нам нужен был только один.

  1. Щелкните правой кнопкой мыши загруженный застежка-молнияархив и выберите Извлечь все.
  2. Откройте извлеченную папку и используйте только тот файл, который вам действительно нужен (для нас, recommendations.csv). Остальное игнорируйте.
Почему это важно: если вы импортируете весь пакет вслепую, вы тратите много дискового пространства и тратите время на импорт файлов, которые ваш анализ никогда не затрагивает. Извлеките, затем выберите.

Шаг 3. Импорт выполняется медленно, а файл растет. Это нормально.

CSV-файл размером 2 ГБ не импортируется мгновенно. Дайте этому время. Людей удивляют две вещи, и обе ожидаемы:

Импортируйте файл точно так же, как в руководстве по SQL (назовите таблицу, оканчивающуюся на _raw, отметьте «имена столбцов в первой строке»), затем нажмите Ctrl+S чтобы сохранить.

Шаг 4. Создайте индекс (шаг, который ускоряет большие запросы)

Представьте себе телефонную книгу и представьте одни и те же имена в том порядке, в котором люди переезжали в город. Оба содержат одну и ту же информацию. Только один позволяет найти имя, не читая каждую страницу. Держите эту картинку, потому что это именно то, что описано в следующем абзаце.

Ан индекс — это ярлык поиска в столбце. Без него каждый раз, когда вы выполняете поиск или присоединяетесь к этому столбцу, база данных считывает все 41 миллион строк сверху вниз. С одним он переходит прямо к нужным строкам. На маленьком столике этого никогда не заметишь. По большому счету, это разница между мгновенным и непригодным для использования.

Создайте индекс один раз по столбцу, к которому вы будете присоединяться или фильтровать по большинству (обычно идентификатор):

CREATE INDEX IF NOT EXISTS idx_rec_appid ON recommendations(app_id);
Реальные цифры: в нашей таблице с 41 миллионом строк построение этого индекса однажды заняло около 3 минут. После этого объединения, которые могли бы сканироваться, выполнялись мгновенно. Постройте его, нажмите Ctrl+S, и вы заплатите эту стоимость только один раз.

Ловушка: функция клавиши соединения отключает индекс.

Одно уточнение, которое раздражает даже людей, разбирающихся в индексах. Индекс на title помогает присоединиться ON a.title = b.title — но в тот момент, когда вы обертываете ключ в функцию, например ON LOWER(a.title) = LOWER(b.title), простой индекс не используется. Такая переноска является стандартным приемом для сопоставления имен без учета регистра. Индекс сортировал исходные значения, а не строчные. База данных молча возвращается к сравнению каждой строки с каждой строкой. И снова реальные цифры: объединение 13 000 строк против 33 000 — небольшие таблицы по меркам этого руководства! — это 427 миллионов сравнений без индекса, длительностью более 30 минут. Исправление представляет собой индекс выражения, построенный именно на том выражении, которое использует соединение:

CREATE INDEX IF NOT EXISTS idx_songs_lower
  ON artist_songs (LOWER(primary_artist), LOWER(title));

Тот же запрос потом: секунды. Модернизированное практическое правило: индексируйте не только столбец, по которому выполняется поиск объединений, но и точное выражение они ищут по.

Шаг 5. Сначала напишите запрос к образцу

Вы не хотите ждать 41 миллион строк каждый раз, когда исправляете опечатку в своем запросе. Разработайте небольшой фрагмент, а затем запустите готовый запрос для всего.

Как только запрос в образце будет правильным, удалите LIMIT и запустить его по-настоящему.

Шаг 6. Агрегируйте заранее и никогда не выбрасывайте на экран миллионы необработанных строк.

Если попросить инструмент отобразить 41 миллион строк, он заморозится. В любом случае вам почти никогда не нужны необработанные строки, вам нужен краткое содержание. Использовать GROUP BY чтобы свернуть данные в одну строку для каждой интересующей вас вещи:

SELECT app_id, COUNT(*) AS num_reviews, AVG(hours) AS avg_hours
FROM recommendations
GROUP BY app_id;

Это превращает 41 миллион строк обзора в одну аккуратную строку за игру. Достичь COUNT, AVG, SUM, и GROUP BY прежде чем ты когда-нибудь потянешься за SELECT *.

Причуда, которая незаметно ломает фильтр: типы данных

Этот не возвращает ни ошибок, ни строк. Прежде чем читать дальше, спросите себя, что бы вы сделали, если бы фильтр, в котором вы были уверены, оказался пустым. Если ответ «проверьте фильтр еще раз», следующий раздел сэкономит вам день, потому что с фильтром все в порядке.

Прежде чем доверять какому-либо фильтру в большой таблице, сначала посмотрите на фактические значения (SELECT * FROM recommendations LIMIT 10;). Большие реальные файлы любят хранить вещи удивительными способами. Классический вариант: столбец ВЕРНО/ЛОЖЬ, хранящийся как Текст 'true' и 'false', а не цифры 1 и 0.

Если вы предположите, что это число, и напишите WHERE is_recommended = 1, это молча соответствует Ничего, и вы получите уверенно неправильный ответ без сообщения об ошибке. Исправление заключается в том, чтобы просто соответствовать тому, как данные действительно хранятся:

WHERE is_recommended = 'true'
Эмпирическое правило: запрос, который возвращает ноль строк или невозможное число, обычно является проблемой данных, а не логической проблемой. Взгляните на реальные значения, прежде чем обвинять свой SQL.

Еще одна честная привычка: следить за снимком

Большие наборы данных представляют собой снимки на определенный момент времени. Если вы объедините два больших набора данных, они могут быть собраны в разные даты (наши были), поэтому они описывают одни и те же вещи в несколько разные моменты. Это нормально, но скажите об этом в своей статье. Честность в анализе заключается в том, чтобы открыто сообщить, откуда взялись ваши данные и где два источника не совпадают.

Шпаргалка

СитуацияЧто делать
Файл не открывается в ExcelЭто более ~ 1 миллиона строк. Переместите его в базу данных SQLite.
Загрузка представляет собой застежка-молнияархив с дополнительными файлами.Извлеките, используйте только один файл, который вам нужен.
Импорт кажется замороженнымФайл размером в несколько ГБ занимает несколько минут. Пусть это закончится. Проверьте, есть ли у вас место на диске.
Объединения или фильтры работают медленноCREATE INDEX в столбце id один раз.
Запрос выполняется медленноРазвивайтесь с LIMIT 1000, затем удалите его.
Инструмент зависает на результатахНе SELECT * миллионы строк. GROUP BY к резюме.
Фильтр ничего не возвращает/странные итогиПроверьте типы данных. Логическое значение может быть текстом 'true', нет 1.

Когда SQLite недостаточно

SQLite удобно обрабатывает многогигабайтные файлы, которые охватывают практически все, с чем вы столкнетесь во время обучения и создания портфолио. Если вы когда-нибудь перерастете это, следующие инструменты: DuckDB (создан для быстрого анализа больших файлов) и pandas с chunksize на Python (читать огромный файл по частям). Мышление, которое вы только что изучили, сохраняется и в дальнейшем: поместите его в базу данных, проиндексируйте ключ, делайте выборку во время построения, агрегируйте перед отображением.

Готовы применить это на практике?

тот Курс SQL обучает точным инструментам, которые укрощают большие данные: JOIN, GROUP BYи агрегатные функции с отработанными примерами, практикой и пробным экзаменом. Все в браузере, ничего устанавливать не нужно.

Откройте набор SQL →

Или приступайте к делу и учитесь, написав запросы: открыть SQL-практикум, тринадцать запросов, каждый из которых добавляет что-то одно к последнему.

Вы можете выполнять работу, как только кто-то скажет вам, в чем она заключается. Расплывчатый вопрос — это та часть, которая вас останавливает.

Думать как аналитик Это 64 страницы, посвященные половине работы: определение показателя, составление отчета по результатам анализа, изучение данных, прежде чем вы им поверите, и высказывание вслух того, о чем ваши данные не могут вам сказать.

Думать как аналитик, 19 $ →