如何用Python将JSON转为Athena的map<string,string>格式并生成兼容Parquet文件
解决Athena map<string,string>显示异常及Python生成合规Parquet文件的方法
一、在Athena中显示正确的JSON格式
Athena对map<string,string>类型的默认输出会用=分隔键值,要转换成标准JSON的key:value格式,可通过以下两种SQL函数实现:
- 使用
json_format()函数:专门将复杂类型(map/struct/array)转为标准JSON字符串
SELECT json_format(your_map_column) AS standard_json FROM your_table;
- 使用
CAST()函数将map类型转为JSON类型
SELECT CAST(your_map_column AS JSON) AS standard_json FROM your_table;
执行上述任意语句后,即可得到符合预期的{"Datawarehouse":"Package/PackageBody/Portfolio/MuniSectorBreakdown", "DividendBreakdown":"Package/Dividend"}格式输出。
二、用Python生成支持Athena map<string,string>类型的Parquet文件
核心是确保Parquet文件中存储的是真正的map类型,而非JSON字符串。推荐使用pyarrow或pandas+pyarrow组合实现:
方法1:使用pyarrow直接生成
import pyarrow as pa import pyarrow.parquet as pq # 构造包含字典的数据集(字典对应map<string,string>) data = [ {"target_map_col": {"Datawarehouse": "Package/PackageBody/Portfolio/MuniSectorBreakdown", "DividendBreakdown": "Package/Dividend"}} ] # 显式定义schema,指定列类型为map<string, string> schema = pa.schema([ ("target_map_col", pa.map_(pa.string(), pa.string())) ]) # 转换为pyarrow表并写入Parquet table = pa.Table.from_pylist(data, schema=schema) pq.write_table(table, "valid_map_parquet.parquet")
方法2:使用pandas结合pyarrow
import pandas as pd # 构造DataFrame,列值为字典类型 df = pd.DataFrame({ "target_map_col": [{"Datawarehouse": "Package/PackageBody/Portfolio/MuniSectorBreakdown", "DividendBreakdown": "Package/Dividend"}] }) # 指定engine为pyarrow写入Parquet,确保类型映射正确 df.to_parquet("valid_map_parquet_pandas.parquet", engine="pyarrow", index=False)
注意:若之前的Parquet文件是将JSON字符串作为普通字符串存储,而非map类型,Athena会无法正确解析为map<string,string>,需重新生成合规的Parquet文件。
内容的提问来源于stack exchange,提问作者Harshal Patil
相关产品推荐
相关产品推荐

