将数据从无模式数据库迁移到关系数据库:MongoDB到Snowflake

将数据从无模式数据库迁移到关系数据库:MongoDB到Snowflake,mongodb,snowflake-cloud-data-platform,talend,dynamic-schema,Mongodb,Snowflake Cloud Data Platform,Talend,Dynamic Schema,我们有一个用例让我写这篇文章,我相信你们中的许多人都会面临这种情况。这种情况是通过单个Talend作业将多个集合从MongoDB迁移到Snowflake数据库中,并将集合的顶级节点保留为Snowflake表中的单个字段 现在我们知道Talend不支持MongoDB源的动态模式,因为MongoDB集合不强制模式,这意味着,我们必须为每个现有/新收集创建单独的作业/子作业,我们希望接收这些作业。我们还必须重新设计这些作业,以便将来对文档进行修改,同时确保这些作业始终有效,因此,我们必须寻找替代解决方

我们有一个用例让我写这篇文章,我相信你们中的许多人都会面临这种情况。这种情况是通过单个Talend作业将多个集合从MongoDB迁移到Snowflake数据库中,并将集合的顶级节点保留为Snowflake表中的单个字段

现在我们知道Talend不支持MongoDB源的动态模式,因为MongoDB集合不强制模式,这意味着,我们必须为每个现有/新收集创建单独的作业/子作业,我们希望接收这些作业。我们还必须重新设计这些作业,以便将来对文档进行修改,同时确保这些作业始终有效,因此,我们必须寻找替代解决方案

这就是方法

第一步:从MongoDB集合中获取所有顶级密钥及其类型。我们使用了聚合和$ObjectToArray将所有顶级键和值对转换为文档数组,然后使用$unwind$group$addToSet在整个集合中获得不同的键和值类型

 {
"_id" : "1",
"keys" : [ 
    "field1~string", 
    "field2~object", 
    "filed3~date",
    "_id~objectId"
 ]
}

第二步:在Mongo数据类型和Snowflake数据类型之间创建一对一映射。我们创建了一个名为“数据类型”的散列映射来存储这些信息。或者,该信息可以存储在表或文件等中

 java.util.Map<String,String> dataTypes = new java.util.HashMap<String,String>();
 dataTypes.put("string","VARCHAR");
 dataTypes.put("int","NUMBER");
 dataTypes.put("objectId","VARCHAR");
 dataTypes.put("object","VARIANT");
 dataTypes.put("date","TIMESTAMP_LTZ");
 dataTypes.put("array","VARCHAR");
 dataTypes.put("bool","BOOLEAN");
java.util.Map数据类型=new java.util.HashMap();
put(“string”、“VARCHAR”);
数据类型。put(“int”,“NUMBER”);
dataTypes.put(“objectId”、“VARCHAR”);
数据类型。put(“对象”、“变量”);
数据类型。put(“日期”、“时间戳”);
put(“数组”、“VARCHAR”);
数据类型。put(“bool”、“BOOLEAN”);
第三步:将键与雪花进行比较:首先,我们查询雪花信息\u架构如果表存在或不存在,我们创建表,如果表存在,我们检查文档中字段的更改,并在雪花表中添加或修改这些列。DDL脚本是通过在第二步中使用“数据类型映射”并在第一步中迭代键生成的

步骤四:使用mongoexport命令将数据从MongoDB卸载到本地文件系统:

mongoexport --db <databaseName> --collection <collectionName> --type=csv --fields=<fieldList> --out <filename>
mongoexport--db--collection--type=csv--fields=--out
在第一步中,根据钥匙准备好钥匙

步骤五:使用Snowsql使用PUT命令将.csv文件从本地文件系统转移到雪花转移位置

snowsql -d <database> -s <schema> -o exit_on_error=true -o log_level=DEBUG  -q  'put <fileName> @<internalStage> OVERWRITE=TRUE';
snowsql-d-s-o exit_on_error=true-o log_level=DEBUG-q'put@OVERWRITE=true';
步骤六:将数据从暂存位置加载到雪花表

COPY INTO <tableName> FROM @<internalStage> 
[file_format=<fileFormat>] [pattern=<regex_pattern>]
从复制到@
[文件格式=][模式=]
指定文件格式和模式在这里是可选的,我们使用正则表达式在一个雪花阶段中为每个集合暂存多个文件


第七步:维护集合列表,该列表可以放在本地文件系统或数据库表中的文件中,也可以放在Talend作业中,迭代集合列表,并通过参数化集合名称、表名和,作业中的文件名和暂存名等。

一种解决方案是将Mongodb集合的记录加载到类型为的雪花字段中。然后,创建一个雪花 使用Snowflake的提取特定关键点

将数据导出为JSON类型

mongoexport --type=json --out <filename>
根据需要将键提取到视图的列中

create view collection_name_view as
select
  collection_name_exports:key1 as field1,
  collection_name_exports:key2 as field2
from collection_name_exports