2024年最新职业院校大数据技术——数据挖掘1(2),2024年最新2024年大数据开发阿里&腾讯&百度&字节校招面试汇总

img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

需要这份系统化资料的朋友,可以戳这里获取

// 非数值类型的数据需要先进行StringIndexer处理后再进行onehot
// 其实就是把类型改为从0开始的键
val indexer: StringIndexerModel = new StringIndexer()
.setInputCol(“color”)
.setOutputCol(“index_color”)
.fit(data)
// 如果输入字段本身就数字类型,那么稀疏向量的个数是最大值+1,
// 因为默认从0开始表示第一个类型
val encoder = new OneHotEncoder()
.setInputCol(“index_color”)
.setOutputCol(“encoded_color”)
.setDropLast(false)
encoder.fit(indexData).transform(indexData)

val indexData: DataFrame = indexer.transform(data)
/**
* 计算两个列表的杰卡德相似度
* @param list1
* @param list2
* @return 两个列表的杰卡德相似度
*/
def jaccardSimilarity(list1: List[String], list2: List[String]): Double = {
val set1 = list1.toSet
val set2 = list2.toSet
val intersection = set1.intersect(set2).size.toDouble
val union = set1.union(set2).size.toDouble
intersection / union
}


StandardScaler是Spark ML库中的一个特征处理方法,用于对数值型特征进行标准化处理。标准化是一种常见的特征处理方法,它可以将数值型特征缩放到一个标准的范围,使得它们在数值上处于同一数量级,从而避免某些特征由于数值过大而在模型中占据主导地位。


具体来说,StandardScaler会对每个特征进行以下操作:


1. 计算特征的平均值和标准差。
2. 将特征的每个值减去平均值,然后除以标准差。  
 这样处理后,每个特征的平均值会变为0,标准差会变为1。


例如,假设你有一个DataFrame,它包含两个字段:“length"和"price”。你可以使用VectorAssembler将这两个字段合并为一个向量列"features",然后使用StandardScaler对这个向量列进行标准化处理。假设"length"字段的平均值为a,标准差为b,"price"字段的平均值为c,标准差为d,那么StandardScaler会将"features"列中的每个向量 
 
 
 
 
 [ 
 
 
 x 
 
 
 , 
 
 
 y 
 
 
 ] 
 
 
 转换为 
 
 
 [ 
 
 
 ( 
 
 
 x 
 
 
 − 
 
 
 a 
 
 
 ) 
 
 
 / 
 
 
 b 
 
 
 , 
 
 
 ( 
 
 
 y 
 
 
 − 
 
 
 c 
 
 
 ) 
 
 
 / 
 
 
 d 
 
 
 ] 
 
 
 
 [x, y] 转换为 [(x - a) / b, (y - c) / d] 
 
 
 [x,y]转换为[(x−a)/b,(y−c)/d]。


## 基础知识


### 余弦相似度


* A,B为向量,向量长度必须一致,这表示维度一致。
* 公式如下:  
 ![余弦相似度计算公式](https://img-blog.csdnimg.cn/direct/eb0235e2863240bd8a2b50de28283afb.png)
* 代码如下:



import org.apache.spark.ml.linalg.{Vector, Vectors}
import org.apache.spark.sql.functions.udf

// 定义一个UDF,用于计算两个向量的余弦相似度
val cosineSimilarity = udf((v1: Vector, v2: Vector) => {
val dotProduct = v1.dot(v2)
val norms = Vectors.norm(v1, 2) * Vectors.norm(v2, 2)
dotProduct / norms
}:Double)


上面的v1,v2可以看作向量A、B。


这段代码是用来计算两个向量的余弦相似度。余弦相似度是一种常用的相似度度量方法,它可以衡量两个向量之间的夹角的余弦值。如果两个向量的方向完全相同,那么它们的余弦相似度就是1;如果两个向量的方向完全相反,那么它们的余弦相似度就是-1;如果两个向量是正交的,那么它们的余弦相似度就是0。


这段代码中的每一行都有特定的作用:


1. val dotProduct = Vectors.dot(v1, v2):这行代码计算了向量v1和v2的点积。点积是将两个向量的对应元素相乘,然后将结果相加得到的一个标量。**公式中对应分子的计算**。
2. val norms = Vectors.norm(v1, 2) \* Vectors.norm(v2, 2):这行代码计算了向量v1和v2的范数(也就是长度),然后将结果相乘。范数是将向量的每个元素的平方相加,然后取平方根得到的一个标量。**公式中对应分母的计算。**
3. dotProduct / norms:这行代码计算了点积除以范数的结果。这就是余弦相似度。


## 23年国赛题代码


每个feature函数和它调用的子函数表示每个特征工程的任务代码。


为什么要这么写呢?  
 因为不可能一步到位,所以分步完成每一个任务。


注意:代码中数据获取皆从mysql中获取,任务书可能要求是hive、hudi。



package Bds

import Bds.DataFrameUtils._ // 这是封装的一个获取各种数据仓库配置项的模块
import org.apache.spark.ml.feature._
import org.apache.spark.ml.linalg._
import org.apache.spark.ml.functions.vector_to_array
import org.apache.spark.sql.DataFrame
import org.apache.spark.sql.expressions.Window
import org.apache.spark.sql.functions._

object dataMining {
val spark = getSparkSession(“dataM”)
spark.sparkContext.setLogLevel(“OFF”)
// 获取mysql配置项
val mySQLConfig = getMySQLCf(“shtd_store”,“sku_info”,“bigdata1”)

def order_detail(): DataFrame ={
mySQLConfig(“dbtable”) = “order_info”
val order = spark.read.format(“jdbc”).options(mySQLConfig).load()
mySQLConfig(“dbtable”) = “order_detail”
val detail = spark.read.format(“jdbc”).options(mySQLConfig).load()
mySQLConfig(“dbtable”) = “sku_info”
val sku_info = spark.read.format(“jdbc”).options(mySQLConfig).load()

// 连接三个表即可剔除不存在现有维表的数据
order.join(detail,order("id")===detail("order\_id"))
  .select(order("user\_id"),detail("sku\_id"))
  .join(sku_info,col("sku\_id")===col("id"))
  // 不确定种类是指sku\_id还是category3\_id,这里用的是category,如果使用sku\_id注释掉下面这一行即可
  .select(col("user\_id"),col("category3\_id").as("sku\_id"))
  .dropDuplicates("user\_id","sku\_id")

}

def feature1(targetUser:Int=6708): Unit ={
val userBuySku = order_detail()

val resultDf = userBuySku.filter(col("user\_id")=!=targetUser).join(
  userBuySku.filter(col("user\_id")===targetUser),
  Seq("sku\_id"),"semi"
).groupBy("user\_id").count()
val result = resultDf.orderBy(desc("count")).limit(10)
  .collect().map(_.getLong(0)).mkString(",")
println("-------------------相同种类前10的id结果展示为:--------------------")
println(result)

}

def skuFeature(): DataFrame ={
// 读取商品数据
val sku = spark.read.format(“jdbc”).options(mySQLConfig).load()

// 对price、weight进行规范化(StandardScaler)
val vectorCol = Array("price","weight")
val assembler = new VectorAssembler().setInputCols(vectorCol).setOutputCol("feature")
val assembled= assembler.transform(sku)
val Scaler = new StandardScaler().setInputCol("feature").setOutputCol("selectFeature")

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

gqEM-1715661854316)]

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 30
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值