PySpark:将 String 类型的 DataFrame 列转换为 Double 时出现 KeyError

PySpark : KeyError when converting a DataFrame column of String type to Double

我正在尝试通过 PySpark 学习机器学习。我有一个数据集,它有几个 String 列,它们的值是 True or False or Yes or No。我正在使用 DecisionTree,我想将这些 String 值转换为相应的 Double 值,即 True, Yes 应更改为 1.0False, No应更改为 0.0。我看到一个教程,他们做了同样的事情,我想出了这段代码

df = sqlContext.read.csv("C:/../churn-bigml-20.csv",inferSchema=True,header=True)

from pyspark.sql.types import DoubleType
from pyspark.sql.functions import UserDefinedFunction

binary_map = {'Yes':1.0, 'No':0.0, 'True':1.0, 'False':0.0}
toNum = UserDefinedFunction(lambda k: binary_map[k], DoubleType())

csv_data = df.drop('State').drop('Area code') \
    .withColumn('Churn', toNum(df['Churn'])) \
    .withColumn('International plan', toNum(df['International plan'])) \
    .withColumn('Voice mail plan', toNum(df['Voice mail plan'])).cache()

然而,当我 运行 这样做时,我得到了很多看起来像这样的错误。

  File "C:\..\spark-2.1.0\python\lib\pyspark.zip\pyspark\worker.py", line 70, in <lambda>
  File "C:\..\workspace\PyML\src\ModelBuilding.py", line 20, in <lambda>
    toNum = UserDefinedFunction(lambda k: binary_map[k], DoubleType())
KeyError: False

注意:我正在使用 Spark 2.1 和 Python 3.5 开发 PySpark,我想我遵循的教程使用 spark 1.6 和 Python 2.7.所以我不知道这是 Python 语法问题之一。

我通过将映射部分更改为:

解决了这个问题
binary_map = {'Yes':1.0, 'No':0.0, True : 1.0, False : 0.0}
toNum = UserDefinedFunction(lambda k: binary_map[k], DoubleType())

我刚刚删除了 True 和 False 中的引用。我认为这很奇怪,但是当我使用 print(df.printSchema()) 检查 DataFrame 的架构时,它显示具有 True 和 False 值的字段的类型为 boolean.

架构

root
 |-- State: string (nullable = true)
 |-- Account length: integer (nullable = true)
 |-- Area code: integer (nullable = true)
 |-- International plan: string (nullable = true)
 |-- Voice mail plan: string (nullable = true)
  .
  .
  .
 |-- Customer service calls: integer (nullable = true)
 |-- Churn: boolean (nullable = true)

这就是为什么我不得不去掉引号的原因。谢谢。