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

时间:2017-04-20 05:41:48

标签: python machine-learning pyspark user-defined-functions apache-spark-2.0

我正在尝试使用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语法问题之一。

1 个答案:

答案 0 :(得分:1)

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

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

我刚刚删除了True和False的引用。我认为这很奇怪但是当我使用DataFrame检查print(df.printSchema())的架构时,它显示具有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)

这就是我不得不取消报价的原因。谢谢。