通过Glue从DocumentDb同步数据到Redshift时数组转字符串如何处理
可行实现方案
方案1:AWS Glue ETL环节预先处理数组字段(最优选择)
- 在Glue转换脚本中提前处理DocumentDB读取到的字符串数组字段,避免流转到Redshift后变成不可直接操作的普通字符串
- 需保留数组结构:将数组序列化为标准JSON格式字符串,写入Redshift的
SUPER类型字段,Redshift SUPER类型原生支持数组、嵌套JSON的查询操作 - 需按数组元素做过滤/聚合:在Glue中调用
explode函数将数组拆分为多行,每行对应一个数组元素,和原行其余字段关联后写入Redshift
- 需保留数组结构:将数组序列化为标准JSON格式字符串,写入Redshift的
- PySpark Glue脚本参考片段:
from pyspark.sql.functions import col, explode # 读取DocumentDB数据后的df # 方案1.1 保留数组结构,适配Redshift SUPER类型 df = df.withColumn("arr_field", col("arr_field").cast("string")) # 建Redshift表时对应字段设为SUPER,写入后可直接用数组语法查询 # 方案1.2 拆分数组为多行 df_exploded = df.withColumn("arr_element", explode(col("arr_field"))).drop("arr_field") # 写入后每个数组元素为独立行,可直接做过滤、分组统计
方案2:Redshift侧直接解析已同步的字符串数组
如果已完成同步、不打算修改Glue链路,可直接用Redshift自带函数处理格式合规的字符串数组:
- 首先确认同步后的字符串数组为标准JSON格式,示例格式为
["val1","val2","val3"] - 通过
JSON_PARSE函数转换后即可执行数组操作,SQL示例:
-- 字符串转SUPER类型数组 SELECT JSON_PARSE(arr_str_column) AS native_array FROM your_table; -- 提取数组第1个元素 SELECT JSON_PARSE(arr_str_column)[0] AS first_val FROM your_table; -- 数组拆分为多行 SELECT t.id, elem FROM your_table t, UNNEST(JSON_PARSE(t.arr_str_column)) elem;
- 若同步后的字符串格式不标准(如缺少引号、括号异常),可先通过
REGEXP_REPLACE类正则函数规整格式后再调用JSON_PARSE处理
方案3:修改Glue链路的Schema映射配置
- 在Glue Crawler或者Glue Job的Schema配置中,手动指定数组字段的目标写入类型为Redshift的SUPER类型,关闭自动类型推断,避免Glue默认将数组映射为普通VARCHAR类型
- 全量同步调整后,增量同步保持该映射规则即可,不需要额外的转换逻辑
内容的提问来源于stack exchange,提问作者aditya Damera
相关产品推荐
相关产品推荐

