从spark版本2.4起,**OneHotEncoderEstimator已重命名为OneHotEncoder
常用于StringIndexer之后,返回的新的列是一个向量
例如,对于 5 个类别,输入值 2.0 将映射到 [0.0, 0.0, 1.0, 0.0] 的输出向量。
独热编码(One-Hot Encoding)
将表示为标签索引的分类特征映射到二进制向量,该向量最多具有一个单一的单值,该单值表示所有特征值集合中特定特征值的存在。此编码允许期望连续特征(例如逻辑回归)的算法使用分类特征。对于字符串类型的输入数据,通常首先使用StringIndexer对分类特征进行编码OneHotEncoderEstimator可以转换多列,为每个输入列返回一个热编码的输出矢量列。通常使用VectorAssembler将这些向量合并为单个特征向量。OneHotEncoderEstimator支持handleInvalid参数,以选择在转换数据期间如何处理无效输入。可用的选项包括“keep”(将任何无效输入分配给额外的分类索引)和“error”(引发错误)。
01.导入模块生成对象:
from pyspark.sql import SparkSession
from pyspark.ml.feature import oneHotEncoderEstimator
spark = SparkSession.builder.config("spark.driver.host","192.168.1.4")
.config("spark.ui.showConsoleProgress","false")
.master("local[*]").appName("OneHotEncoderEstimator").getOrCreate()
sc = spark.sparkContext
02.构建数据
输入的列的数据需要是double类型:
data = spark.createDataframe([
("hadoop",3.0),
("spark",4.0),
("flink",0.0),
("kafka",1.0),
("java",2.0),
("flink",0.0),
("kafka",1.0),
("python",5.0)
], ["key", "value"])
data.show()
data.printSchema()
输出结果:
+------+-----+ | key|value| +------+-----+ |hadoop| 3.0| | spark| 4.0| | flink| 0.0| | kafka| 1.0| | java| 2.0| | flink| 0.0| | kafka| 1.0| |python| 5.0| +------+-----+ root |-- key: string (nullable = true) |-- value: double (nullable = true)
03.使用OneHotEncoderEstimator转换器
model = oneHotEncoderEstimator.fit(data) res = model.transform(data) res.show()
输出结果:
+------+-----+-------------+ | key|value| res| +------+-----+-------------+ |hadoop| 3.0|(5,[3],[1.0])| | spark| 4.0|(5,[4],[1.0])| | flink| 0.0|(5,[0],[1.0])| | kafka| 1.0|(5,[1],[1.0])| | java| 2.0|(5,[2],[1.0])| | flink| 0.0|(5,[0],[1.0])| | kafka| 1.0|(5,[1],[1.0])| |python| 5.0| (5,[],[])| +------+-----+-------------+
04.查看输出列的类型:
res.printSchema()
输出结果:
root |-- key: string (nullable = true) |-- value: double (nullable = true) |-- res: vector (nullable = true)



