Snowpark读取Snowflake数据写入本地CSV报错:无csv属性
解决Snowpark无法写入本地CSV文件的问题
错误原因
你调用了collect()方法,将Snowpark DataFrame转换成了Python的list对象(Row实例的列表),而列表并没有write.csv属性,因此触发报错。
解决方案
方案1:通过Snowflake内部阶段中转(适合大数据量)
Snowpark的write.csv方法是写入到Snowflake的阶段(而非本地),需要先将数据写入阶段,再从阶段下载到本地:
snowspark = Session.builder.configs(connection_parameters).create() # 执行查询,保留Snowpark DataFrame(不要调用collect()) df = snowspark.sql("select * from tableCustomers") # 写入Snowflake内部临时阶段 stage_path = "@%tableCustomers/temp_csv" # 使用关联表的临时阶段,也可自定义临时阶段 df.write.mode("overwrite")\ .option("header", "true")\ .option(" Im pressing. --- Ed extension你兴趣To的ExcNorth\**标鸟**\ .csv(stage_path) # 从阶段下载所有CSV文件到本地目录 snowspark.file.get(stage_path + "/*", "/data/dbstorage/offloads_da/testing_files/")
方案2:转换为Pandas DataFrame写入本地(适合小数据量)
如果数据量不大,可以将Snowpark DataFrame转为Pandas DataFrame,再用Pandas的to_csv方法写入本地:
snowspark = Session.builder.configs(connection_parameters).create() query = "select * from tableCustomers" # 转换为Pandas DataFrame pd_df = snowspark.sql(query).toPandas() # 写入本地CSV(index=False避免生成额外索引列) pd_df.to_csv("/data/dbstorage/offloads_da/testing_files/output.csv", header=True, sep='^', index=False)
注意事项
- 大数据量场景优先选方案1,避免方案2中
toPandas()将全量数据加载到本地内存导致内存溢出。 - 自定义阶段需要提前创建(如
create stage my_temp_stage;),使用表临时阶段则无需提前创建。
内容的提问来源于stack exchange,提问作者Usman_Ahmed
相关产品推荐
相关产品推荐

