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

如何将S3路径列表转换为带双列的Spark DataFrame?

问题解决:将S3路径列表转换为Spark DataFrame

错误原因

你当前的代码把每个S3路径和对应的文件夹名称分别添加到一维列表中,导致new_dict的结构是[路径1, 名称1, 路径2, 名称2,...]。而Spark创建DataFrame时,需要每个元素代表一行数据(比如元组、字典或列表),一维字符串列表无法被推断出两列的Schema,因此抛出TypeError: Can not infer schema for type: <class 'str'>。

修正方案

方案1:使用元组存储每行数据

修改循环逻辑,每次将完整路径和文件夹名称作为一个元组添加到列表中:

new_data = []
for folder in subfolders:
    # 移除路径末尾的斜杠,避免split后出现空字符串
    cleaned_folder = folder.rstrip('/')
    # 拆分路径并取最后一部分作为table_name
    table_name = cleaned_folder.split('/')[-1]
    # 将一行的两个字段打包成元组加入列表
    new_data.append( (folder, table_name) )

# 创建DataFrame并指定列名
df = spark.createDataFrame(new_data, ["s3_prefix", "table_name"])
df.show()

方案2:使用字典存储每行数据(可读性更强)

用字典明确指定每个字段的名称,Spark可以自动推断Schema:

new_data = []
for folder in subfolders:
    cleaned_folder = folder.rstrip('/')
    table_name = cleaned_folder.split('/')[-1]
    new_data.append({
        "s3_prefix": folder,
        "table_name": table_name
    })

# 无需手动指定列名,Spark会从字典键推断
df = spark.createDataFrame(new_data)
df.show()

关键细节说明

  • 处理路径时用rstrip('/')移除末尾斜杠,避免拆分后得到空字符串(比如原路径raw/ingest_date=20240918/eventos/直接split会得到['raw', 'ingest_date=20240918', 'eventos', ''],取最后一个元素会是空值)。
  • 取文件夹名称时用split('/')[-1],相比固定取索引name[2]更灵活,即使路径层级变化也能正确获取最后一级文件夹名。

内容的提问来源于stack exchange,提问作者Julio

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 03:45:06