大数据 OneHot编码

特征工程 OneHot编码

需求

现有表一表order,其中字段为

1
2
3
4
id int,
name string,
sku_id int,
spu_id int

有另外一表sku_info,其中字段为

1
2
id int,
name string

现在要对order表中 sku_id进行OneHot处理

开始

使用Spark 相关库 Scala 2.12.X进行

1. 创建Spark上下文

1
2
3
4
5
6
val spark = SparkSession
    .builder()
    .master("local[*]")
    .appName("dawf")
    .enableHiveSupport()
    .getOrCreate()

2.读取表数据

1
2
3
4
5
val conf = new Properties()
conf.put("user","root")
conf.put("password","123456")
val order = spark.read.jdbc("jdbc:mysql://192.168.xx.xx/xx?useSSL=false", "order", conf)
val sku_info = spark.read.jdbc("jdbc:mysql://192.168.xx.xx/xx?useSSL=false", "sku_info", conf)

3.提取全部sku_id

函数 解释
distinct 去重
collect 将数据收集
map Row转为Any
1
val allSku_id = sku_info.select("id").distinct().collect().map(f => f.get(0))

4.创建动态表

1
var order_var = order.select("id", "sku_id")

5.遍历sku_id完成OneHot

1
2
val udf1 = udf((d1 : Double, d2 : Double) => if(d1 == d2) "1.0" else "0.0")
allSku_id.foreach(f => order_var = order_var.withColumn(s"sku_id#${f}", udf1(col("sku_id"), lit(f))))
使用 Hugo 构建
主题 StackJimmy 设计