我在学习使用PySpark
进行机器学习。我有一个数据集,其中包含几个String
类型的列,这些列的值可能是True或False或Yes或No
。我正在使用DecisionTree
,我想将这些String
值转换为相应的Double
值,即True, Yes
应更改为1.0
,而False, No
应更改为0.0
。我看到一个教程中做了同样的事情,于是我写了如下代码
df = sqlContext.read.csv("C:/../churn-bigml-20.csv",inferSchema=True,header=True)from pyspark.sql.types import DoubleTypefrom pyspark.sql.functions import UserDefinedFunctionbinary_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)
所以这就是为什么我必须去掉引号。谢谢。