Pandas转Spark DataFrame类型合并失败,如何单独转换指定列类型?
解决方案
有两种可行方法,都能实现仅转换Id列为DoubleType,同时保留其他列(包括Field数组结构)的原样:
方法一:手动定义目标Schema后转换
先自定义Schema(仅修改Id的类型,其余与原Schema完全一致),再用该Schema创建Spark DataFrame,彻底避免自动推断类型的问题:
- 导入所需的Spark类型
from pyspark.sql.types import StructType, StructField, StringType, DoubleType, ArrayType
- 定义匹配需求的Schema
custom_schema = StructType([ StructField("Id", DoubleType(), nullable=True), StructField("Field", ArrayType( StructType([ StructField("key", StringType(), nullable=True), StructField("value", StringType(), nullable=True) ]), containsNull=True ), nullable=True) ])
- 使用自定义Schema转换Pandas DataFrame
spark_df = spark.createDataFrame(pandas_df, schema=custom_schema)
方法二:先处理Pandas列再转换
如果Id列包含无法直接转为数值的字符串,可先在Pandas中清理该列,再转换(Pandas中的数组结构会被Spark正确识别,无需担心Field列的类型问题):
- 转换Pandas的
Id列为数值类型,无效值转为NaN
import pandas as pd pandas_df['Id'] = pd.to_numeric(pandas_df['Id'], errors='coerce')
- 直接转换为Spark DataFrame
spark_df = spark.createDataFrame(pandas_df)
补充:若已有Spark DataFrame(Id为StringType)
如果已经成功创建了Spark DataFrame但Id列类型不符合要求,可直接修改该列类型,其余列保持不变:
from pyspark.sql.types import DoubleType spark_df = spark_df.withColumn("Id", spark_df["Id"].cast(DoubleType()))
内容的提问来源于stack exchange,提问作者Jim Macaulay
相关产品推荐
相关产品推荐

