特征工程 OneHot编码
需求
现有表一表order,其中字段为
1
2
3
4
|
id int,
name string,
sku_id int,
spu_id int
|
有另外一表sku_info,其中字段为
现在要对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))))
|