Amazon Redshift Spectrum外部CSV表如何兼容列顺序不同的上传CSV
支持CSV列顺序与表定义不匹配的解决方案
你当前使用的默认文本存储格式是按字段位置匹配解析,所以要求CSV列顺序和表定义完全一致,有两个可行的方案可以解决这个问题:
方案1:使用OpenCSVSerDe按表头名称映射(推荐)
替换默认的解析器为Hive自带的org.apache.hadoop.hive.serde2.OpenCSVSerde,可以自动根据CSV表头的列名和表定义的列名做匹配,完全不限制列的顺序。
修改后的建表语句参考:
create external table a_schema.my_table( col_a varchar(10), col_b varchar(10) ) ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde' WITH SERDEPROPERTIES ( "separatorChar" = ",", "quoteChar" = "\"", "escapeChar" = "\\" ) STORED AS TEXTFILE LOCATION 's3://some-url.com/upload/' TBLPROPERTIES ('skip.header.line.count'='1');
注意事项:
- 需保证CSV表头的列名和表定义的列名完全一致,包括大小写、特殊字符,匹配不到的列会返回NULL
- 绝大多数主流Hive发行版都默认自带该SerDe,无需额外引入依赖
- 如果CSV有自定义的分隔符、引号、转义规则,直接调整
SERDEPROPERTIES里的对应参数即可
方案2:中间临时表适配
如果不方便修改原有表的结构和解析规则,可以用临时中间表做适配:
- 新建一个通用中间表,字段数设置为CSV最大可能的列数,字段名统一命名为
c1、c2、c3... - 每次读取CSV时先获取第一行的表头顺序,拼接对应的查询SQL,按表头和目标表列的对应关系做字段映射后插入到目标表即可,示例:
-- CSV表头顺序为col_b、col_a时的插入语句 insert into a_schema.my_table select c2 as col_a, c1 as col_b from temp_csv_table where c1 != 'col_b'; -- 过滤表头行
内容的提问来源于stack exchange,提问作者NoPlaceLike127.0.0.1
相关产品推荐
相关产品推荐

