文章目录
maxcompute使用篇
1.mongoDB与maxcompute 进行数据同步
1.1 基本类型的数据
- 基本数据类型会根据同步任务配置的读取字段中的name自动读取对应path下的数据,并根据数据类型做自动转换,您无需指定column的type属性,如下图_id,uuid,key_name等普通类型可以根据配置的类型属性进行自动转换
1.2部分复杂类型的数据
-
需要通过配置column的type属性,进行自定义处理,如shop_list以key_info字段
注意:
1.在mongoDB和maxcompute进行数据同步时,如果mongoDB某个字段(如:key_info) 数据类型为Document,在mongoDB侧没有配置对应的Document类型的话,则直接将Document转 JSON 序列化处理
2.如果mongoDB某个字段(如:shop_list) 数据类型为Array,在mongoDB侧没有配置对应的Array类型的话,则会将Array转成Document类型数据,无法进行处理
3.有关MongoDB Reader支持的MongoDB数据类型详情,请查看该链接:https://help.aliyun.com/zh/dataworks/user-guide/mongodb-data-source?spm=a1z3jh.13523495.0.0.27af6242XNV15M
Array数据类型:
Document数据类型:
maxcompute侧配置:
2.maxcompute中复杂数据类型解析
2.1 get_json_object
-
概述:从 JSON 字符串中提取特定字段值的函数,接受一个 JSON 字符串和一个路径表达式作为参数,返回一个字符串类型的值,表示指定路径的 JSON 字段值。如果路径不存在,返回
NULL
-
语法 : get_json_object(json_column, ‘$.name’)
-
注意:一次只能解析一个json字段,可以嵌套解析多层json
2.2 json_tuple
-
概述:通过列名来指定要提取的字段,相对来说更加直观。在同时提取多个字段时,代码的可读性更好。如果路径不存在,返回
NULL
-
语法 : json_tuple(json_data, ‘name’, ‘age’)
-
注意:
1.每次能够同时解析多个字段,不能解析嵌套的json,如果需要解析嵌套的,那么只能一层层解析
2.json_tuple如果需要给解析的多个json字段起别名,需要结合侧视图一起使用
2.3 处理json几种失效的情况:
(1)json格式不对,输入的字符串根本不是有效的 JSON 格式。例如,字符串存在语法错误、缺失关键的括号或引号等。
(2)提供的路径表达式错误。路径表达式用于指定要从 JSON 中提取的部分,如果表达式不正确,无法准确定位到目标数据。
(3)数据类型不匹配。例如,期望提取的是一个字符串,但实际是一个数字或对象。
(4)嵌套层次过深。如果 JSON 数据的嵌套层次非常复杂,可能超出了 get_json_object 函数的处理能力或导致性能问题。
(5)处理超大的 JSON 数据。当 JSON 数据过大,可能会导致内存不足或处理超时的情况。
2.4 STR_TO_MAP、MAP_KEYS
-
STR_TO_MAP:
- 概述:用于将一个字符串转换为映射(map)类型
- 语法:STR_TO_MAP(map_string_column, ‘,’, ‘:’) ,分隔键值对的分隔符是
','
,分隔键和值的分隔符是':'
-
MAP_KEYS
- 概述:获取映射(map)类型数据的所有键组成的数组
- 语法:MAP_KEYS(map_column)
-
补充:结构体(struct)和映射(map)之间的区别
- STRUCT<name:STRING, age:INT, grade:STRING>
- MAP<STRING,STRING>
2.5 regexp_replace
- 概述:用于使用正则表达式进行字符串替换
- 语法 : regexp_replace(string, pattern, replacement)
string
:要进行替换操作的原始字符串。pattern
:正则表达式模式,用于匹配要被替换的部分。replacement
:用于替换匹配部分的新字符串
2.6 FROM_JSON
- 概述:用于将 JSON 字符串解析为特定数据结构(如结构体、数组等)的函数,常与炸裂函数一起使用
- 语法 : from_json(list_ids,‘array’)
- array : 转换的数据类型
- STRING : 数组里面的数据类型
2.7 nvl
- 概述:
nvl
函数用于处理空值(注意:在maxcompute中没有ifnull函数) - 语法 : nvl(expr1, expr2)
expr1
:要检查是否为 NULL 的表达式。expr2
:如果expr1
为 NULL,则返回这个表达式的值
- 注意事项
nvl
函数只能处理一个空值情况,如果需要处理多个不同类型的空值,可以结合其他函数或逻辑来实现- 确保替换值的类型与要处理的列的类型兼容,否则可能会导致类型转换错误
2.8 trim
-
概述:用于去除字符串两端的特定字符
-
语法 : trim([leading|trailing|both] [characters] FROM string)
leading
:表示去除字符串开头的字符,默认是去除两端的字符。trailing
:表示去除字符串末尾的字符both
:表示去除字符串两端的字符,这是默认行为characters
:要去除的字符集,如果不指定,则默认去除空格string
:要进行处理的字符串trim(string)
:默认去除字符串两端的空格