Поскольку значительная часть моей когорты решила работать с тем же набором данных из Kaggle, я решил перенести его на сервер MySQL на AWS, чтобы:
- Я мог бы воспользоваться бесплатными сервисами уровня AWS на RDS (для размещения различных баз данных SQL), чтобы разместить свои данные и запустить запрос и
- У меня есть общая конечная точка, которая может позволить нескольким пользователям получить доступ к базе данных в любое время
Я пошел с движком MySQL по привычке, но это будет работать и для других движков (таких как PostgreSQL/SQLite). Вам просто нужно настроить некоторые из приведенных ниже шагов.
- На панели мониторинга AWS на вкладке Сервисы нажмите кнопку RDS .
- На следующей странице нажмите на Экземпляры на боковой панели, затем Запустите экземпляр БД.
- Выберите предпочитаемый движок, но убедитесь, что установите флажок ниже , где написано “Включить только параметры, подходящие для уровня бесплатного использования RDS” , и нажмите Далее . (Если вы не балер, в этом случае вам следует следовать моему отдельному руководству, где я рассказываю о том, как жить как настоящий балер).
- На следующей странице прокрутите страницу до раздела Настройки , оставив остальное нетронутым, если вы не знаете, что делаете. Другие варианты в основном не отображаются, если вы выбрали опцию бесплатного уровня.
В поле Идентификатор экземпляра БД введите имя этого экземпляра базы данных. Это не имя базы данных, в которой хранятся ваши таблицы. Это весь экземпляр вашего сервера, на котором будут храниться несколько баз данных. В этом случае я называю его metis db instance
, потому что я планирую хранить несколько баз данных для разных проектов. Установите основное имя пользователя и пароль комбинацию, которая будет использоваться для входа на ваш сервер. Этим именем пользователя/паролем можно поделиться с другими, но позже вы можете создать дополнительных пользователей с различными уровнями разрешений. ДАЛЕЕ
- В следующем окне первое, на что вы хотите обратить внимание, – это Сеть и безопасность.
Виртуальное частное облако: Выберите VPC по умолчанию .
VPC-это облачный сервер, на котором размещаются ваши службы. Всем учетным записям AWS выделен VPC по умолчанию, и если вы уже использовали другие их сервисы (например, запуск сервера EC2, как мы делали в классе), он, скорее всего, уже работает в том же VPC по умолчанию.
Подсеть : Снова выберите по умолчанию . Это подсегмент вашего VPC (сегментированный по диапазонам IP — адресов) Общедоступность: Короткий ответ – Да . Длинный ответ, если вы хотите быть более безопасным, вы можете сделать это частным, и в этом случае только службы (такие как ваш сервер EC2), работающие в том же VPC (все внутри облака на диаграмме выше) могут взаимодействовать с ним. Поскольку мы уже настроили EC2 раньше, наши ноутбуки Jupyter, которые мы запускаем внутри этого сервера, могут подключаться к нему. Однако это означает, что вы не можете поделиться своей базой данных с кем-либо еще за пределами вашего VPC, в том числе с вашего персонального компьютера. Зона доступности: Нет предпочтений Параметры безопасности VPC: Создать новый
- В разделе Параметры базы данных
Имя базы данных: Это имя вашей базы данных. В моем случае я назвал его instacartdb
, потому что именно там я буду хранить все данные Instacart из Kaggle.
Порт: 3306 является портом по умолчанию для баз данных MySQL. Давайте так и оставим.
Оставьте все остальное как есть и в нижней части нажмите Запустить экземпляр БД. На следующей странице нажмите Просмотреть экземпляр БД. Поздравляю, вы создали базу данных SQL в облаке! Но еще одно..
Прокрутите страницу вниз и в разделе Группы безопасности выберите группу безопасности, которая была прикреплена к вашему RDS.
На следующей странице нажмите на вкладку Входящие внизу, а затем редактировать .
Этот шаг позволит вам настроить, какие IP-адреса разрешены для подключения к вашей базе данных. Это особенно важно, если ваша база данных была общедоступна на предыдущем шаге, поскольку вы хотите ограничить, какие IP-адреса могут получить доступ к общедоступной конечной точке.
В моем случае, однако, у меня есть общедоступные данные, которыми я хочу поделиться с кем угодно, поэтому я меняю IP-адрес источника на 0.0.0.0/0
, что в основном дает доступ друзьям И врагам.
Как правило, вы хотите сделать это более безопасным, потому что, даже если он защищен паролем, вы все равно подвержены хакерским/DDOS-атакам. Поскольку я нахожусь на бесплатном уровне, сервер автоматически отключится, если он подвергнется DDOS-атаке, но в противном случае можно понести дорогостоящий счет, если кто-то решит переполнить ваш сервер запросами.
Нажмите кнопку Сохранить .
Наконец, вернитесь на страницу экземпляра вашего сервера RDS и найдите конечную точку . Если он еще не появился, это потому, что ваш экземпляр все еще инициализируется. Дайте ему еще несколько минут, и он должен появиться.
Этот URL-адрес-это то, как ваша точка доступа к базе данных.
Подключение к базе данных
В вашем терминале давайте установим все необходимые зависимости.
pip install -c anaconda mysql-connector-pythonpip install mysql-connector
Далее в вашем ноутбуке Jupyter мы импортируем зависимости
import pandas as pd import mysql.connector from sqlalchemy import create_engine
Далее мы хотим установить соединение с базой данных. Замените все значения в скобках фактическими значениями. Помните, что ПОРТ
3306
.
engine = create_engine( 'mysql+mysqlconnector://[USERNAME]:[[PASSWORD]@[](mailto:pokemon1@metisdbinstance.cyjtcanl7pse.us-west-2.rds.amazonaws.com)URL_ENDPOINT]:[PORT]/[DATABASE_NAME]', echo=False)
Затем мы хотим создать таблицу с соответствующими именами столбцов, типом и индексом. Убедитесь, что имена столбцов точно совпадают с заголовками столбцов в ваших CSV-файлах, иначе вы можете столкнуться с некоторыми проблемами. Кроме того, обратите внимание, что я установил aisle_id
в качестве первичного ключа. Это важно для индексации, когда вы СОЕДИНЯЕТЕ
таблицы.
query = ''' CREATE TABLE `instacartdb`.`aisles` ( `aisle_id` INT NOT NULL, `aisle` INT(11) NULL DEFAULT NULL, PRIMARY KEY (`aisle_id`), UNIQUE INDEX `aisle_id_UNIQUE` (`aisle_id` ASC)); ''' # Open engine connection con = engine.connect() # Perform query: rs rs = con.execute(query)
В приведенном выше примере у меня есть только один дополнительный столбец помимо первичного ключа, но у меня есть пример более сложной таблицы ниже:
CREATE TABLE `instacartdb`.`products` ( `product_id` INT NOT NULL, `product_name` VARCHAR(300) NULL DEFAULT NULL, `aisle_id` INT(11) NULL DEFAULT NULL, `department_id` INT(11) NULL DEFAULT NULL, PRIMARY KEY (`product_id`), UNIQUE INDEX `product_id_UNIQUE` (`product_id` ASC));
Примечание product_name
– это длинное строковое имя, поэтому оно задается как VARCHAR(300)
, что означает, что это строка длиной до 300 символов. Если вы установите слишком низкое значение, и ваш набор данных будет иметь значение, превышающее эту длину, данные будут усечены. Это не приведет к ошибке, но создаст предупреждение, чтобы вы знали.
Затем мы хотим импортировать csv-файл в виде фрейма данных pandas.
data = pd.read_csv('./PATH/TO/YOUR/FILENAME.csv')
Наконец, если фрейм данных и таблица SQL выровнены, следующая строка импортирует CSV в базу данных в виде имени таблицы проходы
.
data.to_sql(name='aisles', con=engine, if_exists = 'replace', index=False)
Промойте и повторите эти шаги с таким количеством CSV-файлов, как у вас есть, и это все! Ваш набор данных готов к работе!