如何将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
相关产品推荐
相关产品推荐

