【问题标题】:Pyspark mistake: requirement failed: Column must be of type numeric but was actually of type string mistakePyspark 错误:要求失败:列必须是数字类型,但实际上是字符串类型错误
【发布时间】:2021-08-28 14:06:46
【问题描述】:

我尝试将 pandas 数据帧转换为 PySpark 格式

mySchema = StructType([ StructField("movieId", IntegerType())\
                       ,StructField("title", StringType()),
                       StructField("userId", IntegerType()),
                       StructField("rating", FloatType())
                       ])
movielens = spark.createDataFrame(merged_df, mySchema)
movielens.printSchema()

架构

root
 |-- movieId: integer (nullable = true)
 |-- title: string (nullable = true)
 |-- userId: integer (nullable = true)
 |-- rating: float (nullable = true)

然后为模型准备我的数据

(train_set,temp) = movielens.randomSplit([8.0,1.0],seed=1)
validation_set = (temp.join(train_set,["userId"],"left_semi").join(train_set,["movieId"],"left_semi"))
removed = (temp.join(validation_set,["movieId","userId"],"left_anti"))
train_set = train_set.union(removed)
als = ALS(
        userCol = "userId",
        itemCol = "movieId",
        ratingCol = "rating"
)
evaluator = RegressionEvaluator(
    metricName = "rmse",
    labelCol = "rating", 
    predictionCol = "prediction"
)

model = als.fit(train_set)
predictions = model.transform(validation_set)

然后犯了那个错误

IllegalArgumentException: requirement failed: Column userId must be of type numeric but was actually of type string.

这怎么可能,因为我在 MySchema 中手动编写了类型? 任何帮助将不胜感激

【问题讨论】:

  • 尝试train_set.printSchema()确认数据类型?
  • 没有任何改变。列的类型保持不变

标签: apache-spark pyspark


【解决方案1】:

您可能有难以使用 RegressionEvaluator 评估的 NaN/缺失值。这意味着冷启动问题

您可以通过将 drop 指定为冷启动策略来继续。

als = ALS(
        userCol = "userId",
        itemCol = "movieId",
        ratingCol = "rating",
        coldStartStrategy = "drop"
)

我包含了 spark 文档的摘录,其中阐述了 spark 如何处理此问题。

Spark Cold-Start strategy

使用 ALSModel 进行预测时,经常会遇到 测试数据集中不存在的用户和/或项目 训练模型。这通常发生在两种情况下:

在生产中,对于没有评分历史的新用户或项目,并且 模型尚未经过训练(这是“冷启动 问题”)。在交叉验证期间,数据在训练之间拆分 和评估集。使用 Spark 中的简单随机拆分时 CrossValidator 或 TrainValidationSplit,其实很常见 遇到不在评估集中的用户和/或项目 训练集 默认情况下,Spark 在 ALSModel.transform 当用户和/或项目因素不存在时 该模型。这在生产系统中很有用,因为它 表示一个新的用户或项目,因此系统可以做出决定 一些作为预测的后备。

但是,这在交叉验证期间是不可取的,因为任何 NaN 预测值将导致评估指标的 NaN 结果 (例如在使用 RegressionEvaluator 时)。这使得模型 无法选择。

Spark 允许用户将coldStartStrategy 参数设置为“drop” in 为了删除包含预测的 DataFrame 中的任何行 NaN 值。然后评估指标将在 非 NaN 数据并且将是有效的。该参数的用法说明 在下面的示例中。

注意:目前支持的冷启动策略是“nan”( 上面提到的默认行为)和“丢弃”。进一步的策略可能 将来会支持。

【讨论】:

  • 我根据您的消息修复了代码 - 同样的错误(并且我在将数据集转换为 PySpark 之前检查了 pandas 中的数据集 - 没有 NaN。感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 2018-10-05
  • 2016-11-13
  • 1970-01-01
  • 2018-04-24
  • 2019-12-24
  • 1970-01-01
  • 2020-02-16
  • 1970-01-01
相关资源
最近更新 更多