You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 02:06:04