FAQ - mongo传输报错cannot resolve age given input colunns: [_id, city, name]

问题描述/异常栈
读取mongo数据遇到空值或者缺少部分字段
FAQ - mongo传输报错cannot resolve '`xxx'' given input - 图1
发现版本
LTS 650/7.0
解决方案
1、脏数据很多,正确数据极少时
{age: {$ne: null}} 过滤非空数据;
{age: {$eq: null}} 过滤为空数据并使用自定义表达式转换
FAQ - mongo传输报错cannot resolve '`xxx'' given input - 图2 2、脏数据少,正确数据多时
高级参数 source.spark.mongodb.input.sampleSize
是采样的文档数目,默认为 10000。当从 MongoDB 数据库加载数据时,Spark 会随机采样指定数量的文档进行分析,以便更快地获取集合的数据分布情况。如果采样数目太小,可能会导致分析结果不准确;如果采样数目太大,则会增加分析时间和内存消耗。
source.spark.mongodb.input.samplePoolSize
是采样线程池的大小,默认为 1。当采样的文档数量较大时,可以使用多线程并发采样,以提高采样效率。将此参数设置为大于 1 的值,可以启用多个线程进行采样。 其他官方参数均可通过下列方法设置
source.spark.mongodb.input.参数=xxx
target.spark.mongodb.output.参数=xxx
3、设置source.readAsJson=true(源端去向端均支持)
节点参数,ndi.spark.spark-conf.spark.transmit.reader.mongodb.readAsJson = true
4、自定义表达式
字段映射的来源表字段分为两类:1、xxxx as 列名,我们认为是自定义表达式,另外是MongoDB的字段。
1)新增自定义参数:source.readAsJson,值为true的含义:传输会将
1、字段映射填写的MongoDB的字段,
2、MongoDB采样一条消息解析到的字段 类型都定义为string。
2)新增自定义参数:source.sourceCustomSchema={"column1":"string", "columnName2":"int"}
使用场景:
4.1、某些字段不想根据前一个参数被定义为string,则可以额外定义为其他类型
4.2、自定义表达式引用了某个字段,但这个字段仅在MongoDB部分消息中出现,传输采样推断可能无法解析到字段,可以通过这个参数定义字段类型
类型可配置的值枚举:string、int、long、float、double、boolean、short、timestamp、date、decimal(38,10)
问题原因
mongo数据不规范,存在空值

作者:林帅