PySpark添加数组列表到DataFrame报错求助:StructType无法接受字符串对象
PySpark创建DataFrame报错解决:StructType无法接受字符串对象
问题场景
作为PySpark新手,尝试将mssparkutils.fs.ls(WORK_FOLDER)获取并处理后的文件列表(数组形式)存入DataFrame时,触发错误:
TypeError: StructType can not accept object '20230205' in type <class 'str'>
相关代码
# Validation Id Checking columns = StructType([StructField('Name',StringType())]) FileList = [] files = mssparkutils.fs.ls(WORK_FOLDER) for file in files: if file.name.endswith('csv'): fileName = file.name array = fileName.split("_") for word in array: index = word.find('Exchange') if index != 0: FileList.append(str(word)) print(FileList) df = spark.createDataFrame(data=FileList,schema=columns)
FileList输出结果
['20230205', '001040.csv', '20230205', '200005.csv', '20230206', '200006.csv', '20230207', '200021.csv', '20230208', '200007.csv', '20230209', '200010.csv', '20230210', '200009.csv']
报错原因
Spark的createDataFrame方法在传入StructType类型的schema时,要求输入数据必须是行对象、字典列表或元组列表(每个元素对应一行的字段值)。直接传入字符串数组时,Spark会把每个字符串当作整行数据,但schema定义的是一个名为Name的单字段结构,两者不匹配,因此触发类型错误。
解决方案
提供两种可行修改方式:
方式一:转换数据格式适配StructType schema
将字符串数组转换成元组列表,每个元组包含单个元素(对应Name字段的值),修改创建DataFrame的代码:
df = spark.createDataFrame(data=[(item,) for item in FileList], schema=columns)
方式二:简化schema定义
如果只需要单一字符串列,可以直接用字符串列表定义schema,同时转换数据格式:
# 替换原schema定义 columns = ["Name"] # 创建DataFrame df = spark.createDataFrame(data=[(item,) for item in FileList], schema=columns)
或者更简洁的写法,直接指定列名:
df = spark.createDataFrame(FileList, StringType()).toDF("Name")
验证效果
修改后运行代码,即可生成包含Name列的DataFrame,FileList中的每个字符串会对应DataFrame的一行数据。
内容的提问来源于stack exchange,提问作者Wasim Syed
相关产品推荐
相关产品推荐

