
apache parquet是一种高效的列式存储格式,常用于大数据场景。当api返回parquet格式的数据时,它实际上是以二进制字节流的形式传输的。在python中,使用requests库获取api响应时,理解response.text和response.content的区别至关重要:
在处理API返回的Parquet数据时,一个常见的错误是尝试将二进制数据作为文本进行处理。以下是一个错误的示例及其原因:
import requests
import io
import pyarrow.parquet as pq
import pandas as pd
def get_orders_data_incorrect(date):
# 假设这是一个API接口,实际url需要替换
url = "http://your-api-endpoint/orders"
params = {"date": date}
response = requests.get(url, params=params)
if response.status_code == 200:
# 错误示范:将二进制内容解码为字符串
# 这会破坏Parquet文件的二进制结构
data_str = response.text.strip()
return data_str
else:
print(f"Failed to fetch orders data: {response.status_code}")
return None
# 调用函数获取数据(假设API返回Parquet)
date_to_fetch = "2023-12-08"
orders_info_str = get_orders_data_incorrect(date_to_fetch)
if orders_info_str:
try:
# 错误示范:尝试将已损坏的字符串重新编码为字节流
# 原始二进制信息已丢失
buffer = io.BytesIO(orders_info_str.encode())
table = pq.read_table(buffer) # 这里会抛出错误
df = table.to_pandas()
print(df.head())
except Exception as e:
print(f"解码Parquet数据时发生错误: {e}")
# 错误信息可能类似:'Parquet format error: Invalid Parquet file'
# 或 'pyarrow.lib.ArrowInvalid: Parquet magic bytes not found'原因分析: 当API返回Parquet的二进制数据时,response.text会尝试将其解码为字符串。由于Parquet数据并非文本,这个解码过程会失败或产生乱码,导致原始的二进制结构被破坏。随后,即使将这个损坏的字符串重新编码回字节流(orders_info_str.encode()),也无法恢复原始的Parquet二进制结构,因此pyarrow.parquet.read_table或pandas.read_parquet将无法识别其为有效的Parquet文件,从而抛出错误。
正确的做法是直接获取API响应的原始字节流(response.content),并将其传递给一个内存缓冲区(io.BytesIO),然后由pandas或pyarrow进行解析。
Pandas提供了read_parquet函数,可以直接从文件路径、URL或类似文件的对象(如io.BytesIO)中读取Parquet数据。
import requests
import io
import pandas as pd # 确保安装了pandas和pyarrow/fastparquet
def get_orders_data_pandas(date: str) -> pd.DataFrame | None:
# 假设这是一个API接口,实际url需要替换
url = "http://your-api-endpoint/orders"
params = {"date": date}
try:
response = requests.get(url, params=params)
response.raise_for_status() # 检查HTTP请求是否成功(状态码2xx)
# 关键步骤:直接使用 response.content 获取原始字节流
# 并通过 io.BytesIO 封装成文件对象
df = pd.read_parquet(io.BytesIO(response.content))
return df
except requests.exceptions.RequestException as e:
print(f"API请求失败: {e}")
return None
except Exception as e:
print(f"解码Parquet数据时发生错误: {e}")
return None
# 完整示例:
date_to_fetch = "2023-12-08"
orders_df = get_orders_data_pandas(date_to_fetch)
if orders_df is not None:
print("成功获取并解码Parquet数据,前5行如下:")
print(orders_df.head())
# 进一步处理 orders_df ...
else:
print("未能获取或解码订单数据。")PyArrow是Apache Arrow项目的Python接口,提供了对Parquet格式的底层支持。它允许我们先将数据加载为PyArrow的Table对象,然后再转换为Pandas DataFrame。
import requests
import io
import pyarrow.parquet as pq
import pandas as pd
def get_orders_data_pyarrow(date: str) -> pd.DataFrame | None:
# 假设这是一个API接口,实际url需要替换
url = "http://your-api-endpoint/orders"
params = {"date": date}
try:
response = requests.get(url, params=params)
response.raise_for_status() # 检查HTTP请求是否成功(状态码2xx)
# 关键步骤:直接使用 response.content 获取原始字节流
buffer = io.BytesIO(response.content)
# 使用 pyarrow.parquet.read_table 读取数据为 PyArrow Table
table = pq.read_table(buffer)
# 将 PyArrow Table 转换为 Pandas DataFrame
df = table.to_pandas()
return df
except requests.exceptions.RequestException as e:
print(f"API请求失败: {e}")
return None
except Exception as e:
print(f"解码Parquet数据时发生错误: {e}")
return None
# 完整示例:
date_to_fetch = "2023-12-08"
orders_df_pyarrow = get_orders_data_pyarrow(date_to_fetch)
if orders_df_pyarrow is not None:
print("成功获取并解码Parquet数据(PyArrow方法),前5行如下:")
print(orders_df_pyarrow.head())
# 进一步处理 orders_df_pyarrow ...
else:
print("未能获取或解码订单数据。")两种方法都有效,且底层都依赖于PyArrow来处理Parquet文件。方法一更为简洁,而方法二提供了PyArrow Table的中间表示,这在某些高级场景(如与其他Arrow生态系统工具集成)中可能更有用。
pip install requests pandas pyarrow
if orders_df is not None:
output_filename = f"orders_{date_to_fetch}.parquet"
orders_df.to_parquet(output_filename, index=False) # index=False 避免保存DataFrame索引
print(f"数据已成功保存到 {output_filename}")从API获取Parquet格式数据并进行正确解码的关键在于避免将二进制内容误处理为文本。始终使用requests.Response.content获取原始字节流,并通过io.BytesIO将其封装成文件对象,再交由pandas.read_parquet或pyarrow.parquet.read_table进行解析。掌握这一核心原则,将能有效解决Parquet数据解码中的常见问题,确保数据处理流程的准确性和效率。
以上就是从API正确解析Apache Parquet数据的实践指南的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号