s.exceptions.base.PySparkTypeError: [CANNOT_INFER_TYPE_FOR_FIELD] Unable to infe...

2025年09月04日 14:31 响应: 6.50秒 状态: success

🚨 错误信息

File "/opt/spark-3.5.6-bin-hadoop3/python/lib/pyspark.zip/pyspark/sql/types.py", line 1705, in _infer_schema pyspark.errors.exceptions.base.PySparkTypeError: [CANNOT_INFER_TYPE_FOR_FIELD] Unable to infer the type of the field `avg_optical_flow`. 25/09/04 14:31:11 INFO SparkContext: Invoking stop() from shutdown hook 25/09/04 14:31:11 INFO SparkContext: SparkContext is stopping with exitCode 0.

🤖 AI解决方案

``
[CANNOT_INFER_TYPE_FOR_FIELD] 无法推断字段
avg_optical_flow 的类型。
`

原因分析

Spark 无法自动推断出 avg_optical_flow 字段的数据类型,通常是因为该字段在输入数据中不存在,或者其值不一致导致无法确定单一的数据类型。

解决方案

在创建 Spark DataFrame 时,显式指定 avg_optical_flow 字段的 schema。

如果 avg_optical_flow` 字段应该是一个浮点数,可以这样做:

python
from pyspark.sql.types import StructType, StructField, FloatType

假设你有一个 RDD 或 DataFrame


data = [...] # 你的数据

示例:如果数据是列表的列表


data = [[1.0, 2.5], [2.0, 3.1]]

定义 schema


schema = StructType([
StructField("other_field", FloatType(), True), # 替换 "other_field" 为你的其他字段名
StructField("avg_optical_flow", FloatType(), True)
])

使用 schema 创建 DataFrame


df = spark.createDataFrame(data, schema=schema)

如果你的数据是通过读取文件(如 CSV, JSON)获取的,可以在读取时指定 schema:

python

示例:读取 CSV


df = spark.read.csv("your_data.csv", header=True, schema=schema)

预防措施

  • 明确 Schema 定义:在处理结构化数据时,始终优先定义并使用明确的 Schema,避免依赖 Spark 的自动类型推断。

  • 数据质量检查:在数据加载或转换前,进行数据质量检查,确保目标字段存在且数据类型一致。