使用Pandas的to_parquet报FileNotFoundError,PySpark却可正常读写?
问题:PySpark可正常读写Azure存储Parquet,但Pandas to_parquet触发FileNotFoundError
在Azure Synapse Notebook的PySpark环境中,以下代码能正常读写Azure存储账户中的Parquet文件:
SourceFileName = "2023-05-26-14-17-11-821-object.parquet" TestFileName = "Test" AzureBlobStorageAccountName = "redacted" SourceFilePath = f'abfss://datalake@' + AzureBlobStorageAccountName + '.dfs.core.windows.net/Bronze/ServiceBus/Object/' + SourceFileName dfBronze = spark.read.load(SourceFilePath, format='parquet').cache() dfBronze.createOrReplaceTempView("Bronze") dfSilver = spark.read.load('abfss://datalake@' + AzureBlobStorageAccountName + '.dfs.core.windows.net/Silver/ServiceBus/Object/*.parquet', format='parquet').cache() dfSilver.createOrReplaceTempView("Silver") #<-- 成功将DataFrame写入Azure存储账户
但使用Pandas调用to_parquet时触发FileNotFoundError:
import pandas as pd dict = pd.DataFrame({ "ObjectId": 45, "AdditionalSpecialties": [ { "SpecialtyId": "38", "Specialty": "Family" } ] },{ "ObjectId": 185, "AdditionalSpecialties": [ { "SpecialtyId": "498", "Specialty": "Pandas" }, { "SpecialtyId": "502", "Specialty": "Are Cute" } ] }) df = pd.DataFrame(dict) TestFilePath = f'abfss://datalake@' + AzureBlobStorageAccountName + '.dfs.core.windows.net/Bronze/ServiceBus/Object/' + TestFileName print(df) df.to_parquet(TestFilePath) #<-- 此处报错,无法写入Pandas DataFrame到Azure存储账户
差异原因
- 协议支持差异:PySpark在Azure Synapse环境中已内置对
abfss协议的支持,Synapse会自动处理存储账户的身份验证(比如托管身份、预配置的存储密钥),无需额外配置就能识别并访问Azure存储资源。 - Pandas依赖缺失:Pandas本身不原生支持
abfss协议,要读写Azure存储的Parquet文件,必须额外安装adlfs这类适配Azure存储的驱动库。没有驱动的话,Pandas会把abfss路径当成本地文件路径,自然找不到对应资源,触发FileNotFoundError。 - 身份验证配置差异:就算安装了驱动,Pandas也需要手动配置Azure存储的身份验证信息(存储密钥、SAS令牌等),而PySpark在Synapse中直接继承了工作区的身份配置,无需手动设置。
另外注意:你提供的Pandas代码中,创建DataFrame的语法存在错误(字典定义缺少逗号、嵌套格式不符合要求),但这不是触发FileNotFoundError的原因,只是代码本身的语法问题。
内容的提问来源于stack exchange,提问作者user2197446
相关产品推荐
相关产品推荐

