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

使用pyarrow.float64()创建PySpark DataFrame遇DoubleScalar Schema推断错误

问题解决:PyArrow float64数组创建PySpark DataFrame报错

错误原因

直接将PyArrow Array传入createDataFrame时,Spark会尝试将数组中的每个Scalar元素当作独立行,但无法自动推断PyArrow Scalar的Schema,因此触发CANNOT_INFER_SCHEMA_FOR_TYPE错误。

解决方案(保留PyArrow类型)

方法1:通过PyArrow Table创建DataFrame

Spark原生支持从PyArrow Table读取数据,能完整保留原类型映射。将PyArrow Array包装为Table后,再传入createDataFrame即可:

import pyarrow
import pyspark

session = pyspark.sql.SparkSession.builder \
                              .appName ("pyspark_pyarrow") \
                              .config ("spark.executor.memory", "2g") \
                              .config ("spark.sql.shuffle.partitions", "2") \
                              .config ("spark.driver.host", "localhost") \
                              .config ("spark.sql.execution.arrow.pyspark.enabled", "true") \
                              .getOrCreate()

session.sparkContext.setLogLevel ("DEBUG")

# 创建PyArrow float64类型数组
array = pyarrow.array([1, 2, 3, 4, 5, 6, 7, 8, 9], type=pyarrow.float64())

# 转换为PyArrow Table,指定列名
pa_table = pyarrow.Table.from_arrays([array], names=["value"])

# 基于Table创建DataFrame
df = session.createDataFrame(pa_table)

# 验证类型与数据
df.printSchema()
df.show()

session.stop ()

方法2:手动指定Spark Schema

手动定义与PyArrow float64对应的Spark DoubleType Schema,同时将PyArrow数组转为Spark可识别的行结构:

import pyarrow
import pyspark
from pyspark.sql.types import StructType, StructField, DoubleType

session = pyspark.sql.SparkSession.builder \
                              .appName ("pyspark_pyarrow") \
                              .config ("spark.executor.memory", "2g") \
                              .config ("spark.sql.shuffle.partitions", "2") \
                              .config ("spark.driver.host", "localhost") \
                              .config ("spark.sql.execution.arrow.pyspark.enabled", "true") \
                              .getOrCreate()

session.sparkContext.setLogLevel ("DEBUG")

array = pyarrow.array([1, 2, 3, 4, 5, 6, 7, 8, 9], type=pyarrow.float64())

# 定义匹配float64的Schema
schema = StructType([StructField("value", DoubleType(), nullable=True)])

# 将PyArrow数组转为行数据集合
data = [(val,) for val in array.to_pylist()]

# 创建DataFrame时指定Schema
df = session.createDataFrame(data, schema=schema)

# 验证类型与数据
df.printSchema()
df.show()

session.stop ()

两种方法都能确保全程使用float64(对应Spark DoubleType)类型,且保留PyArrow的类型特性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 07:05:10