SQL到NoSQL:将数据从MySQL复制到Couchbase

鄢松
2023-12-01

介绍

在与Couchbase社区的最后一次互动中,我遇到一个问题,即如何轻松地将数据从当前数据库导入Couchbase。 我的答案总是一样的:

  • 以Talend这样的ETL来做
  • 只需编写一个小程序即可将数据从RDBMS复制到Couchbase…

因此,我编写了这个小程序,使您可以将RDBMS的内容导入Couchbase。 可以按原样使用此工具,也可以查看代码以使其适合您的应用程序。

工具:Couchbase SQL导入器

Couchbase SQL Importer(可从此处获得 )使您可以通过简单的命令行将全部或部分SQL模式复制到Couchbase中。 在解释如何运行此命令之前,让我们看一下导入数据时如何将它们存储到Couchbase中:

  • 每个表格行均导入一个JSON文档
    • 每个表列都变成一个JSON属性
  • 每个文档都由表名和计数器(递增)作为键

以下基于MySQL World示例数据库的具体示例将帮助您了解其工作原理。 该数据库包含3个表:城市,国家/地区,国家/地区语言。 City表如下所示:

+-------------+----------+------+-----+---------+----------------+
| 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文档如下所示:

city:3805
{ 
  "Name": "San Francisco",
  "District": "California",
  "ID": 3805,
  "Population": 776733,
  "CountryCode": "USA"
}

您会看到,我在这里只是将所有行都“移”到Couchbase中。 这是将您的数据集导入Couchbase的一个很好的第一步,但它可能不是您要用于应用程序的最终模型。 大多数时候,您将必须看到何时在JSON文档中使用嵌入式文档,值列表..。

除了JSON文档外,该工具还根据以下逻辑创建视图:

  • 一个视图,其中列出了所有导入的文档,其中以“表”(aka类型)的名称为键
  • 每个具有主键列的表的视图

查看:全部/ by_type

{
  "rows": [
    {"key": "city", "value": 4079}, 
    {"key": "country", "value": 239}, 
    {"key": "countrylanguage", "value": 984}
   ]
}

如您所见,此视图允许您通过单个Couchbase查询获取按类型分类的文档数量。

同样,对于每种表/文档类型,都会创建一个视图,其中索引的键是从表主键构建的。 例如,查询“城市”文档。

查看:city / by_pk?reduce = false&limit = 5

{
  "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

{
  "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.CountryCode和CountryLanguage.Language列组成的CountryLanguage表主键构建的。

+-------------+---------------+------+-----+---------+-------+
| 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工具?

导入程序是一个简单的基于Java的命令行实用程序,使用起来非常简单:

  1. 从此处下载CouchbaseSqlImporter.jar文件。 该文件包含与Couchbase一起使用的所有依赖关系:Java Couchbase Client和GSON。
  2. 下载用于您用作数据源的数据库的JDBC驱动程序。 对于此示例,我正在使用MySQL,并且已经下载了MySQL站点的驱动程序。
  3. 使用适当的关联文件配置导入。
    ## 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:全部以导入所有表,或要导入的表的列表,例如,城市,国家
      • import.createViews:true或false,以强制创建视图。
      • import.typefield:用于在所有包含“ type”的文档中添加新属性。
      • import.fieldcase:null,lower,upper:这将强制属性名称和类型值(例如City或city或CITY)的大小写。
  4. 运行工具!
    java -cp "./CouchbaseSqlImporter.jar:./mysql-connector-java-5.1.25-bin.jar" com.couchbase.util.SqlImporter import.properties

    因此,您可以使用适当的类路径(-cp参数)运行Java命令。

完成后,您可以将数据从SQL数据库获取到Couchbase。 如果您有兴趣了解它的内部工作方式,则可以查看下一段。

代码:如何工作?

该工具的主要类实际上是简单的com.couchbase.util.SqlImporter ,过程是:

  1. 连接到SQL数据库
  2. 连接到Couchbase
  3. 获取表列表
  4. 对每个表执行“从表中选择*”
  • 分析ResultSetMetadata以获取列列表
  • 为每行创建一个Java映射,其中键是列的名称,值是值
  • 将此地图序列化为GSON文档,并将其保存到Couchbase

该代码在ImportTable(String table) Java方法中可用。

有趣的一点是,您可以使用和扩展代码来处理您的应用程序。

结论

我已经快速创建了此工具,以帮助社区中的某些人,如果您正在使用它并且需要新功能,请使用注释或拉取请求让我知道。

参考:从 SQL到NoSQL:从我们的JCG合作伙伴 Tugdual Grall在Tug的Blog博客上将数据从MySQL复制到Couchbase

翻译自: https://www.javacodegeeks.com/2013/07/sql-to-nosql-copy-your-data-from-mysql-to-couchbase.html

 类似资料: