Amazon Athena输出CSV复合类型解析:格式确认与Python库查询
关于Amazon Athena复合类型CSV输出的SerDe问题解答
1. Athena用于复合类型的格式究竟是什么?
Athena导出CSV时对复合类型(数组、Map、结构体等)使用的是Hive SimpleLazySerDe的输出格式——这是Hive默认的SerDe实现之一,Athena继承了Hive的这一行为。结合你的示例,具体规则如下:
- 数组(Array):用方括号
[]包裹元素,元素间以逗号加空格分隔,如[1, 2, 3];嵌套数组为多层方括号嵌套,如[[1, 2], [3, 4]]。 - Map:用大括号
{}包裹键值对,键与值之间用等号=连接,多组键值对以逗号分隔;字符串类型的键/值会自动去掉引号,如查询中的MAP(ARRAY['a'], ARRAY['1'])输出为{a=1}。 - 结构体(Struct):格式通常为
{field1=value1, field2=value2},类似Map结构但键为结构体字段名。
2. 该格式是否为标准格式?
不是标准格式。这种格式是Hive生态自定义的序列化/反序列化规则,未被任何通用标准组织(如IETF、W3C)认可,也与JSON、YAML等通用数据格式不兼容:
- JSON中数组元素仅用逗号分隔(无强制空格),Map键值对用冒号
:连接且字符串必须加引号; - 该格式的字符串无引号、Map用
=的特性,导致无法直接用标准JSON/YAML解析器处理。
3. 是否存在可对该格式进行SerDe操作的Python库?
目前没有AWS官方维护的Python库专门处理这种格式,但有社区实现和可行方案:
- 社区第三方库:部分Hive相关的Python库支持解析该格式,比如
pyhive(通过Hive客户端协议间接处理)、hive-serdes-python(第三方实现的SimpleLazySerDe解析器)。 - PySpark:若工作流可引入PySpark,Spark原生支持Hive的SerDe格式,可通过读取CSV文件并指定
serde为org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe,直接解析复合类型。 - 自定义解析逻辑:针对简单场景,可编写正则表达式或递归解析逻辑处理数组和Map——比如用正则匹配方括号/大括号内容,再拆分元素处理
=分隔的键值对。
示例对照
你的查询代码:
SELECT ARRAY[1,2,3] as array, ARRAY[ARRAY[1,2], ARRAY[3,4]] as array_of_arrays, ARRAY[MAP( ARRAY['a'], ARRAY['1'] )]
对应的CSV输出完全符合SimpleLazySerDe的规则:
"array","array_of_arrays","_col2" "[1, 2, 3]","[[1, 2], [3, 4]]","[{a=1}]"
内容的提问来源于stack exchange,提问作者Martin Macak
相关产品推荐
相关产品推荐

