如何创建值类型不固定的PySpark字典类型列?
解决方案
你的问题出在properties列的Map值类型定义上:当前用IntegerType限制了值只能是整数,但实际数据里包含字符串、空值等多种类型,导致类型不匹配。要支持任意类型的值,有两种实用方法:
方法1:用StringType统一存储所有值
如果可以接受将所有值转为字符串类型,直接修改Map的值类型为StringType即可,所有类型的数据都会被自动转为字符串存储,避免类型报错。
修改后的代码:
from pyspark.sql import SparkSession from pyspark.sql.types import StructField, StructType, StringType, MapType schema = StructType([ StructField('item', StringType(), True), # 将Map的值类型改为StringType StructField('properties', MapType(StringType(), StringType()), True) ]) spark = SparkSession.builder.appName('SparkExample').getOrCreate() dataDictionary = [ ('Eraser',{'cost':1,'color':'white'}), ('Pencil',{'cost':2,'color':'Blue'}), ('Pen',{'cost':3,'color':'black'}), ('Color',{'cost':4,'color':'grey'}), ('Paper',{'cost':5,'color':''}) ] df = spark.createDataFrame(data=dataDictionary, schema = schema) df.printSchema() df.show(truncate=False)
方法2:用AnyType保留原始类型(Spark 3.0+)
如果需要保留值的原始类型(比如整数还是整数、字符串还是字符串),可以使用Spark 3.0及以上版本支持的AnyType,它允许Map的值为任意数据类型。
修改后的代码:
from pyspark.sql import SparkSession from pyspark.sql.types import StructField, StructType, StringType, MapType, AnyType schema = StructType([ StructField('item', StringType(), True), # 使用AnyType作为Map的值类型 StructField('properties', MapType(StringType(), AnyType()), True) ]) spark = SparkSession.builder.appName('SparkExample').getOrCreate() dataDictionary = [ ('Eraser',{'cost':1,'color':'white'}), ('Pencil',{'cost':2,'color':'Blue'}), ('Pen',{'cost':3,'color':'black'}), ('Color',{'cost':4,'color':'grey'}), ('Paper',{'cost':5,'color':''}) ] df = spark.createDataFrame(data=dataDictionary, schema = schema) df.printSchema() df.show(truncate=False)
注意:AnyType仅在Spark 3.0及以上版本可用,若你的Spark版本较低,建议使用方法1。
内容的提问来源于stack exchange,提问作者Nupur
相关产品推荐
相关产品推荐

