Статьи

SQL для NoSQL: скопируйте ваши данные из MySQL в Couchbase

Вступление

Во время моего последнего взаимодействия с сообществом Couchbase у меня возник вопрос, как мне легко импортировать мои данные из моей текущей базы данных в Couchbase. И мой ответ всегда был один и тот же:

  • Возьмите ETL, такой как Talend, чтобы сделать это
  • Просто напишите небольшую программу для копирования данных из вашей RDBMS в Couchbase …

Итак, я написал эту небольшую программу, которая позволяет вам импортировать содержимое СУБД в Couchbase. Эти инструменты можно использовать как есть, или вы можете посмотреть на код, чтобы адаптировать его к вашему приложению.

Инструмент: Couchbase SQL Importer

Доступный здесь Couchbase SQL Importer позволяет вам с помощью простой командной строки скопировать всю или часть вашей схемы SQL в Couchbase. Прежде чем объяснить, как запустить эту команду, давайте посмотрим, как данные сохраняются в Couchbase при их импорте:

  • Каждая строка таблицы импортируется в один документ JSON
    • где каждый столбец таблицы становится атрибутом JSON
  • Каждый документ в качестве ключа состоит из имени таблицы и счетчика (приращение)

Следующий конкретный пример, основанный на образце базы данных MySQL World , поможет вам понять, как он работает. Эта база данных содержит 3 таблицы: City, Country, CountryLanguage. Стол City выглядит так:

1
2
3
4
5
6
7
8
9
+-------------+----------+------+-----+---------+----------------+
| Field       | Type     | Null | Key | Default | Extra          |
+-------------+----------+------+-----+---------+----------------+
| ID          | int(11)  | NO   | PRI | NULL    | auto_increment |
| Name        | char(35) | NO   |     |         |                |
| CountryCode | char(3)  | NO   |     |         |                |
| District    | char(20) | NO   |     |         |                |
| Population  | int(11)  | NO   |     | 0       |                |
+-------------+----------+------+-----+---------+----------------+

Документ JSON, соответствующий этой таблице, выглядит следующим образом:

1
2
3
4
5
6
7
8
city:3805
{
  "Name": "San Francisco",
  "District": "California",
  "ID": 3805,
  "Population": 776733,
  "CountryCode": "USA"
}

Вы видите, что здесь я просто беру все строки и «перемещаю» их в Couchbase. Это хороший первый шаг, чтобы поиграть со своим набором данных в Couchbase, но, вероятно, это не последняя модель, которую вы хотите использовать для своего приложения; Большую часть времени вам придется видеть, когда использовать встроенные документы, список значений и т. д. в ваших документах JSON.

В дополнение к документу JSON инструмент создает представления на основе следующей логики:

  • представление, в котором перечислены все импортированные документы с именем «таблицы» (он же тип) в качестве ключа
  • представление для каждой таблицы со столбцами первичного ключа

Вид: все / по типу

1
2
3
4
5
6
7
{
  "rows": [
    {"key": "city", "value": 4079},
    {"key": "country", "value": 239},
    {"key": "countrylanguage", "value": 984}
   ]
}

Как вы можете видеть, это представление позволяет получить с помощью одного запроса Couchbase номер документа по типу.

Также для каждого типа таблицы / документа создается представление, в котором ключ индекса создается из первичного ключа таблицы. Давайте, например, запросить документы «Город».

Вид: город / by_pk? Уменьшить = ложь & лимит = 5

01
02
03
04
05
06
07
08
09
10
{
  "total_rows": 4079,
  "rows": [
    {"id": "city:1", "key": 1, "value": null},
    {"id": "city:2", "key": 2, "value": null},
    {"id": "city:3", "key": 3, "value": null},
    {"id": "city:4", "key": 4, "value": null},
    {"id": "city:5", "key": 5, "value": null}
  ]
}

Ключ индекса соответствует значению столбца City.ID. Когда первичный ключ состоит из нескольких столбцов, ключ выглядит следующим образом:

Представление: CountryLanguage / by_pk? Reduce = false & limit = 5

01
02
03
04
05
06
07
08
09
10
{
  "total_rows": 984,
  "rows": [
    {"id": "countrylanguage:1", "key": ["ABW", "Dutch"], "value": null},
    {"id": "countrylanguage:2", "key": ["ABW", "English"], "value": null},
    {"id": "countrylanguage:3", "key": ["ABW", "Papiamento"], "value": null},
    {"id": "countrylanguage:4", "key": ["ABW", "Spanish"], "value": null},
    {"id": "countrylanguage:5", "key": ["AFG", "Balochi"], "value": null}
  ]
}

Это представление построено из первичного ключа таблицы CountryLanguage из столбцов CountryLanguage.CountryCode и CountryLanguage.Language.

1
2
3
4
5
6
7
8
+-------------+---------------+------+-----+---------+-------+
| Field       | Type          | Null | Key | Default | Extra |
+-------------+---------------+------+-----+---------+-------+
| CountryCode | char(3)       | NO   | PRI |         |       |
| Language    | char(30)      | NO   | PRI |         |       |
| IsOfficial  | enum('T','F') | NO   |     | F       |       |
| Percentage  | float(4,1)    | NO   |     | 0.0     |       |
+-------------+---------------+------+-----+---------+-------+

Как использовать инструмент Couchbase SQL Importer?

Importer — это простая утилита командной строки на основе Java, довольно простая в использовании:

  1. Загрузите файл CouchbaseSqlImporter.jar здесь. Этот файл содержит все зависимости для работы с Couchbase: клиент Java Couchbase и GSON.
  2. Загрузите драйвер JDBC для базы данных, которую вы используете в качестве источника данных. Для этого примера я использую MySQL, и у меня есть драйвер для сайта MySQL.
  3. Сконфигурируйте импорт, используя подходящий файл связей.
    01
    02
    03
    04
    05
    06
    07
    08
    09
    10
    11
    12
    13
    14
    15
    ## SQL Information ##
    sql.connection=jdbc:mysql://192.168.99.19:3306/world
    sql.username=root
    sql.password=password
     
    ## Couchbase Information ##
    cb.uris=http://localhost:8091/pools
    cb.bucket=default
    cb.password=
     
    ## Import information
    import.tables=ALL
    import.createViews=true
    import.typefield=type
    import.fieldcase=lower

    Этот пример файла свойств содержит три раздела:

    • Два первых раздела используются для настройки соединений с базой данных SQL и кластером Couchbase (обратите внимание, что сначала нужно создать корзину)
    • Третий раздел позволяет настроить сам импорт
      • import.tables: ALL, чтобы импортировать все таблицы, или список таблиц, которые вы хотите импортировать, например, City, Country
      • import.createViews: true или false, чтобы форсировать создание представлений.
      • import.typefield: используется для добавления нового атрибута во все документы, содержащие «тип».
      • import.fieldcase: null, lower, upper: это приведет к регистру имени атрибута и значения типа (например, City или city или CITY).
  4. Запустите инструмент!
    1
    java -cp "./CouchbaseSqlImporter.jar:./mysql-connector-java-5.1.25-bin.jar" com.couchbase.util.SqlImporter import.properties

    Таким образом, вы запускаете команду Java с правильным classpath (параметр -cp).

И все готово, вы можете получить свои данные из базы данных SQL в Couchbase. Если вам интересно посмотреть, как это работает внутри, вы можете взглянуть на следующий абзац.

Кодекс: как это работает?

Основной класс инструмента действительно простой com.couchbase.util.SqlImporter , процесс:

  1. Подключиться к базе данных SQL
  2. Подключиться к Couchbase
  3. Получить список столов
  4. Для каждой таблицы выполните команду «выбрать * из таблицы»
  • Проанализируйте ResultSetMetadata, чтобы получить список столбцов
  • Создайте карту Java для каждой строки, где ключ — это имя столбца, а значение — это значение.
  • Сериализуйте эту карту в документ GSON и сохраните ее в Couchbase

Код доступен в Java-методе ImportTable (таблица строк) .

Интересным моментом является то, что вы можете использовать и расширять код для работы с вашим приложением.

Вывод

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

Ссылка: SQL для NoSQL: скопируйте свои данные из MySQL в Couchbase от нашего партнера по JCG Тугдуала Граля в блоге Tug’s Blog .