介绍
在与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的命令行实用程序,使用起来非常简单:
- 从此处下载CouchbaseSqlImporter.jar文件。 该文件包含与Couchbase一起使用的所有依赖关系:Java Couchbase Client和GSON。
- 下载用于您用作数据源的数据库的JDBC驱动程序。 对于此示例,我正在使用MySQL,并且已经下载了MySQL站点的驱动程序。
- 使用适当的关联文件配置导入。
## 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)的大小写。
- 运行工具!
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 ,过程是:
- 连接到SQL数据库
- 连接到Couchbase
- 获取表列表
- 对每个表执行“从表中选择*”
- 分析ResultSetMetadata以获取列列表
- 为每行创建一个Java映射,其中键是列的名称,值是值
- 将此地图序列化为GSON文档,并将其保存到Couchbase
该代码在ImportTable(String table) Java方法中可用。
有趣的一点是,您可以使用和扩展代码来处理您的应用程序。
结论
我已经快速创建了此工具,以帮助社区中的某些人,如果您正在使用它并且需要新功能,请使用注释或拉取请求让我知道。
翻译自: https://www.javacodegeeks.com/2013/07/sql-to-nosql-copy-your-data-from-mysql-to-couchbase.html