DataX和MongoDB之间的数据导入导出案例

news2024/9/25 15:24:48

DataX和MongoDB之间的数据导入导出案例


文章目录

  • DataX和MongoDB之间的数据导入导出案例
    • 0. 写在前面
    • 1. MongoDB前置知识
      • 1.1 基础概念详解
        • 1.1.1 数据库
        • 1.1.2 集合
        • 1.1.3 文档(Document)
    • 2. DataX 导入导出案例
      • 2.1 读取 MongoDB 的数据导入到 HDFS
        • 2.1.1 编写配置文件
        • 2.1.2 执行
        • 2.1.3 查看结果
      • 2.2 读取 MongoDB 的数据导入 MySQL
        • 2.2.1 在 MySQL 中创建表
        • 2.2.2 编写DataX 配置文件
        • 2.2.3 执行
        • 2.2.4 查看结果


0. 写在前面

  • 版本信息说明:

MySQL数据库和DataX安装在一台机器node01上,而MongoDB是安装在node02这一台机器上

DataX版本:DataX3.0(开源版)

MongoDB版本:MongoDB-5.0.2(Linux环境下安装)

Linux版本:CentOS7.5

1. MongoDB前置知识

1.1 基础概念详解

1.1.1 数据库

一个 mongodb 中可以建立多个数据库。MongoDB 的默认数据库为"db",该数据库存储在 data 目录中。MongoDB 的单个实例可以容纳多个独立的数据库,每一个都有自己的集合和权限,不同的数据库也放置在不同的文件中。

常见操作如下

1)显示所有数据库

> show dbs     
admin   0.000GB 
config  0.000GB 
local   0.000GB 

解析如下:

  • admin:从权限的角度来看,这是"root"数据库。要是将一个用户添加到这个数据库,这个用户自动继承所有数据库的权限。一些特定的服务器端命令也只能从这个数据库运行,比如列出所有的数据库或者关闭服务器。

  • local:这个数据永远不会被复制,可以用来存储限于本地单台服务器的任意集合

  • config:当 Mongo 用于分片设置时,config 数据库在内部使用,用于保存分片的相关信息。

2)显示当前使用的数据库

 > db 
 test     

3)切换数据库

> use local 
switched to    db local    
> db 
local   

1.1.2 集合

集合就是 MongoDB 文档组,类似于 MySQL 中的 table。

集合存在于数据库中,集合没有固定的结构,这意味着你在对集合可以插入不同格式和类型的数据,但通常情况下我们插入集合的数据都会有一定的关联性。

MongoDB 中使用 createCollection() 方法来创建集合。下面我们来看看如何创建集合:

语法格式:

db.createCollection(name, options)                                        

参数说明:

  • name: 要创建的集合名称

  • options: 可选参数, 指定有关内存大小及索引的选项,有以下参数:

字段类型描述
capped布尔(可选)如果为 true,则创建固定集合。固定集合是指有着固定大小的集合,当达到最大值时,它会自动覆盖最早的文档。 当该值为 true 时,必须指定 size 参数。
autoIndexId布尔(可选)如为 true,自动在 _id 字段创建索引。默认为 false。
size数值(可选)为固定集合指定一个最大值(以字节计)。 如果 cappedtrue,也需要指定该字段。
max数值(可选)指定固定集合中包含文档的最大数量。

案例 1:在 test 库中创建一个 whybigdata 的集合

> use test switched to db test
> db.createCollection("whybigdata")
{ "ok" : 1 }
> show collections 
Whybigdata

// 插入数据
> db.whybigdata.insert({"name":"whybigdata","url":"www.whybigdata.com"}) WriteResult({ "nInserted" : 1 })
// 查看数据
> db.whybigdata.find()
{ "_id" : ObjectId("5d0314ceecb77ee2fb2d7566"), "name" : "whybigdata", "url" : "www.whybigdata.com" }

解析说明:

ObjectId 类似唯一主键,可以很快的去生成和排序,包含 12 bytes(默认),由 24 个 16 进制数字组成的字符串(每个字节可以存储两个 16 进制数字),含义是:

  • 前 4 个字节表示创建 unix 时间戳

  • 接下来的 3 个字节是机器标识码

  • 紧接的两个字节由进程 id 组成 PID

  • 最后三个字节是随机数

案例 2:创建一个固定集合 mycol

> db.createCollection("mycol",{ capped : true,autoIndexId : true,size : 6142800, max : 1000})
> show tables; 
whybigdata
mycol

案例 3:自动创建集合

在 MongoDB 中,你不需要创建集合。当你插入一些文档时,MongoDB 会自动创建集合。

> db.mycol2.insert({"name":"whybigdata"}) WriteResult({ "nInserted" : 1 })
> show collections 
whybigdata
mycol 
mycol2

案例 4:删除集合

> db.mycol2.drop() 
True    
> show tables; 
whybigdata    
mycol    

1.1.3 文档(Document)

文档是一组键值(key-value)对组成。MongoDB 的文档不需要设置相同的字段,并且相同的字段不需要相同的数据类型,这与关系型数据库有很大的区别,也是 MongoDB 非常突出的特点。

一个简单的例子:

{"name":"whybigdata"}

注意:

  • 文档中的键/值对是有序的。

  • MongoDB 区分类型和大小写。

  • MongoDB 的文档不能有重复的键。

  • 文档的键是字符串。除了少数例外情况,键可以使用任意UTF-8 字符。

2. DataX 导入导出案例

2.1 读取 MongoDB 的数据导入到 HDFS

2.1.1 编写配置文件

[whybigdata@node01 datax]$ vim job/mongdb2hdfs.json
{
    "job": {
        "content": [
            {
                "reader": {
                    "name": "mongodbreader",
                    "parameter": {
                        "address": ["node02:27017"],
                        "collectionName": "whybigdata",
                        "column": [
							{
								"name":"name",
								"type":"string"
							},
							{
								"name":"url",
								"type":"string"
							}
						],
                        "dbName": "test",
                    }
                },
                "writer": {
                    "name": "hdfswriter",
                    "parameter": {
                        "column": [
							{
								"name":"name",
								"type":"string"
							},
							{
								"name":"url",
								"type":"string"
							}
						],
                        "defaultFS": "hdfs://node01:8020",
                        "fieldDelimiter": "\t",
                        "fileName": "mongo.txt",
                        "fileType": "text",
                        "path": "/datax-out",
                        "writeMode": "append"
                    }
                }
            }
        ],
        "setting": {
            "speed": {
                "channel": "1"
            }
        }
    }
}

mongodbreader 参数解析

  • address: MongoDB 的数据地址信息,因为 MonogDB 可能是个集群,则 ip 端口信息需要以 Json 数组的形式给出。【必填】

  • userName:MongoDB 的用户名。【选填】

  • userPassword: MongoDB 的密码。【选填】

  • collectionName: MonogoDB 的集合名。【必填】

  • column:MongoDB 的文档列名。【必填】

  • name:Column 的名字。【必填】

  • type:Column 的类型。【选填】

  • splitter:因为 MongoDB 支持数组类型,但是 Datax 框架本身不支持数组类型,所以mongoDB 读出来的数组类型要通过这个分隔符合并成字符串。【选填】

2.1.2 执行

[whybigdata@node01 datax]$ bin/datax.py job/mongdb2hdfs.json

2.1.3 查看结果

在这里插入图片描述

2.2 读取 MongoDB 的数据导入 MySQL

2.2.1 在 MySQL 中创建表

mysql> create table whybigdata(name varchar(20),url varchar(20));

2.2.2 编写DataX 配置文件

[whybigdata@node01 datax]$ vim job/mongodb2mysql.json
{
    "job": {
        "content": [
            {
                "reader": {
                    "name": "mongodbreader",
                    "parameter": {
                        "address": ["node02:27017"],
                        "collectionName": "whybigdata",
                        "column": [
							{
								"name":"name",
								"type":"string"
							},
							{
								"name":"url",
								"type":"string"
							}
						],
                        "dbName": "test",
                    }
                },
                "writer": {
                    "name": "mysqlwriter",
                    "parameter": {
                        "column": ["*"],
                        "connection": [
                            {
                                "jdbcUrl": "jdbc:mysql://node01:3306/datax",
                                "table": ["mongo"]
                            }
                        ],
                        "password": "123456",
                        "username": "root",
                        "writeMode": "insert"
                    }            
                }
            }
        ],
        "setting": {
            "speed": {
                "channel": "1"
            }
        }
    }
}

2.2.3 执行

[whybigdata@node01 datax]$ bin/datax.py job/mongodb2mysql.json   

2.2.4 查看结果

mysql> select * from whybigdata;
+	+	+
| name	| url	|
+	+	+
| whybigdata | www.whybigdata.com |
+	+	+

全文结束!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/430518.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

模板的分离编译

目录 : 1.分离编译概念 2.模板是不支持分离编译的 3.报链接错误的原因 4.如何解决 ----------------------------------------------------------------------------------------------------------------------- 1.分离编译概念 一个程序由若干个源文件共同实现&a…

java版工程项目管理系统源码 Spring Cloud+Spring Boot+Mybatis+Vue+ElementUI+前后端分离 功能清单

ava版工程项目管理系统 Spring CloudSpring BootMybatisVueElementUI前后端分离 功能清单如下: 首页 工作台:待办工作、消息通知、预警信息,点击可进入相应的列表 项目进度图表:选择(总体或单个)项目显示1…

Eureka单机搭建

Eureka简介 Eureka Spring Cloud Eureka 是Netflix 开发的注册发现组件,本身是一个基于 REST 的服务。提供注册与发现,同时还提供了负载均衡、故障转移等能力 Eureka3个角色 服务中心,服务提供者,服务消费者 Eureka Server&a…

(leetcode C语言)1. 两数之和 9. 回文数

目录 1. 两数之和 思路 代码 9. 回文数 思路 思路1 代码1 思路2 代码2 1. 两数之和 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。 你可以假设每种输入只…

设计模式-创建型模式之建造者模式

5. 建造者模式5.1. 模式动机无论是在现实世界中还是在软件系统中,都存在一些复杂的对象,它们拥有多个组成部分,如汽车,它包括车轮、方向盘、发送机等各种部件。而对于大多数用户而言,无须知道这些部件的装配细节&#…

linux系统安装和配置网关

Linux 目前国内 Linux 更多的是应用于服务器上,而桌面操作系统更多使用的是 Windows 安装linux虚拟机 网址 VMware下载网址 点击Workstation 16 Pro for Windows下载 安装CentOS centO下载网址 依次点击 7.6.1810/ isos/ x86_64/ CentOS-7-x86_64…

改善供应商关系的八种方法

与供应商保持良好关系的重要性有很多原因。最重要的是,它使每个人的日常工作更加愉快。它还可以为你获得更好的交易,有助于协作并增强商誉。 但是,每个供应商都是不同的,建立牢固的关系可能很棘手。本文将解释企业如何建立并操持…

TypeScript(十二)模块

目录 引言 d.ts声明文件 declare关键字 全局声明 全局声明方式 全局声明一般用作 函数声明 在.ts中使用declare 外部模块(文件模块) 模块关键字module 声明模块 模块声明方式 模块通配符 模块导出 模块嵌套 模块的作用域 模块别名 内部…

机器学习:皮尔逊相关系数——影评相关性分析案例

机器学习:皮尔逊相关系数——影评相关性分析案例 文章目录机器学习:皮尔逊相关系数——影评相关性分析案例:rocket:1、皮尔逊相关系数概念及公式:rocket:2、案例代码部分皮尔逊(pearson)相关系数、 斯皮尔曼(spearman&…

vue2 和 vue3 共存

1.共存的前置条件 1.1 之前全局安装的 vue2 或者 vue3 的脚手架进行卸载,使用 npm命令卸载vue2 npm uninstall vue-cli -g 再使用 vue -V 查看版本出现以下提示为卸载完成 vue3卸载要使用命令npm uninstall vue/cli -g 1.2 安装cnpm 在命令行中输入 npm install -…

java面试题(SpringBoot)

SpringBoot 1.什么是SpringBoot?有什么优点? springboot是spring的子项目,是spring组件的一站式解决方案,简化了使用的难度,简省了配置 优点: 容易上手,提升开发效率内置web容器管理第三方工…

第六章 物理层

数据通信基础 数据通信基本概念 消息与信息;消息是信息的载体 消息:人类能够感知的描述信息:抽象概念,可以理解为消息中所包含的有意义的内容 通信:一点精确或近似地再生另一点的信息信号:传递信息的载体…

提高客户忠诚度的 5 种方法

提高客户忠诚度是成功经营企业的最重要因素之一。忠诚的客户也更有可能向他们的朋友和家人推荐您的业务,从而开辟更多的收入来源。所以您需要将您的战略重点放在建立作为企业主的客户忠诚度上。 提高客户忠诚度的 5种方法 1.优先考虑客户服务 作为企业应该积极主动…

工赋开发者社区 | MES/MOM数据采集系统需求分析和总体设计

随着社会市场需求的不断变化,传统生产车间内的数据采集技术无法跟上市场变化的需求,容易出现数据记录滞后、实时监控困难等问题,造成了车间的生产效率低、产品质量低。在全球信息化的时代背景下,企业内的信息化管理可有效促进经济…

企业管理系统CRM与ERP有何区别

随着企业不断发展壮大,越来越多的企业引进管理系统,助力自身生产管理。目前市面上比较火热的企业管理系统软件有OA、CRM和ERP系统,关于企业OA管理系统,前面我们已经给出了很多介绍。今天主要带大家了解一下企业管理系统CRM和ERP系…

一文弄懂Python中的 if __name__ == __main__

1. 引言 在Python相关代码中,我们经常会遇到如下代码段: # stuff if __name__ "__main__":# do stuff本文将尽可能使用简单的样例来解释这里发生了什么,以及需要使用if __name__"__main__"的情形。请注意,…

m3u8视频文件破解爬取教程(请尊重知识产权,切勿违法),该方法需要基础开发知识

// UserScript // name media-source-extract // namespace https://github.com/Momo707577045/media-source-extract // version 0.8.2 // description https://github.com/Momo707577045/media-source-extract 配套插件 // author Momo707577045 // i…

ACL综合实验

拓扑结构: 要求 1、PC1可以Telnet R1,但是不能pingR1 2、PC1可以ping R2,但是不能Telnet R2 3、PC2的所有要求与PC1相反 使用的设备:4台路由器、1台交换机 解决网络拓扑: 1、确定广播域的个数 2、分配网段 3、配置…

【2023 · CANN训练营第一季】:AscendCL应用开发深入讲解 基础知识介绍

昇腾(Ascend)CANN(Compute Architecture for Neural Networks)是华为推出的一款面向AI处理器的软件开发工具包,用于支持各种AI应用的开发和部署。它的深度神经网络应用开发流程可以分为以下几个主要步骤 AscendCL应用…

TS WIKI 个人知识库软件

TS WIKI 个人知识库软件(VER: 0.1) TS WIKI 目标是做一个可以本地化部署,小型的,适合个人或小型团队的知识管理软件。 T(iny) S(mall) WIKI 软件界面 TS WIKI 功能说明 1、简化的软件依赖和安装 依赖的软件最简化。软件只使用 SQLITE 数据库&#xf…