开发者学堂课程【大数据 Spark2020版(知识精讲与实战演练)第四阶段:数据清洗_数据转换】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/691/detail/12112
数据清洗_数据转换
数据转换
数据处理做具体数据转换
License 是字符串类型,pickUpTime 与 dropUpTime 是时间类型,使用一个方法处理时间类型的数据
parseTime 中接收一个 RichRow 的分装,处理的时间类型是哪一个字段,返回 long 类型,时间转成时间戳
def parseTime(row:RichRow,field:String):Long={
pickUpX,pickUpY,dropOffX,dropOffY 是 Double 类型,对 Double 类型的处理称为 parseLocation,在 parseLocation 中为了把字符串表示的 Dubbo 转为真的 Double,接收的是 Richrow,parseLocation 明确转换的字段,返回的类型是 Double
Def parseLocation(row:RichRow,field:String):Double={
在 pickUpTime,调用 parseTime,将 RichRow 传入,字段为 field=
”
pickup_datatime
”
,dropOffTime 字段为 field=
”
dropOffTime_datatime
”
,pickUpX转换调用 parseLocation,传入 RichRow,字段名为field=
”
pickup_longitude
”
,pickUpY 字段名为field=
”
pickup_latitude
”
,dropOffX 字段名为 field=
”
dropOff_longitude
”
,dropOffY 字段名为field=
”
dropOff_latitude
”
def parse( row : Row) : Trip = {
val richRow = new RichRow(row)
val license = richRow.getAs[string]( field = "hack_license" ).orNull
val pickupTime = parseTime(richRow,field = "pickup_datetime")
val dropoffTime = parseTime(richRow,field = "dropoff_datetime")
val pickup
X
= parseLocation(richRow,field = "pickup_longitude")
val pickupY = parseLocation(richRow,field = "pickup_latitude"")
val dropoff
X
= parseLocation(richRow,field = "dropoff_longitude")
val dropoffY = parselocation(richRow,field = "dropoff_longitude")
Trip(license,pickupTime,dropoffTime,pickup
X
,pickup
Y
,dropoffX,dropoffY)
}
处理完后,trip 就有了,parse 在 map 算子中对所有的 row 转成 trip 类型的数据。
获取时间类型的 data 对象,第一步表示时间类型的格式,使用 SimpleDataFormat 进行相应的转换,时间类型传入 formatter,获取时间更精准通过 Locale.ENFLISH,是一个英国的时区,也可以是其他的本地时间第二部执行转换,获取 Data 对象,getTime 获取时间戳,从 row 中取出对应的字符串转成 Data 类型,通过 formatter 进行转化,通过 row.gwtAs(field)获取 row,是一个 String 类型,time 本质是一个 option 对象,
处理 time 中 option 的 string 转成 Data,需要 time.map(),map 是 option 中的 map,拿到一个 time,用 formatter parse time 字符串,getTime,返回一个 long 型,成功的将 option 中所存放的数据中转成 long 型。
数据集中需要将2013-01-01时间类型转成long型,需要找一个工具将时间类型读出来,
@inline final def map[B](f: A =>B): option[ B]=
if (isEmpty ) None else some(f(this.get))
Map 算法中首先判断是否为空,是空表示 option 没有内容,直接返回 None,否则,返回 some。在 some 算子中会调用 f,传进的函数f,只有当 option 中有数据时才会被调用
option 中的 map 算子使用是较为常见的,option 中有一个 map 算子,map 算子传进一个函数,函数只有在 option 中有值的时候会被调用,返回 some 是会被调用,
如果 option 中没有值,函数不会被调用 time 经过 option 会转为 timeOption, timeOption 与前面 ime Option 不同,前面是一个 string 类型,后面则是 long 类型,option 中有值,转成对应的类型,最终没有值在 parseTime 返回0
def parseTime(row: RichRow,field: string):Long = {
//1.表示出来时问类型的格式 simpleDateFormat
val pattern = "yyyy-MM-dd HH:mm:ss"
val formatter = new simpleDateFormat(pattern,Locale.ENGLISH)
//2.执行转换,获取 Date 对象,getTime 获取时间戳
val time: option[string] = row.getAs [String](field)
v
al timeoption: option[Long] = time.map(time = formatter.parse(time).getTime )timeoption.getorElse(
0
L)
Parselocation 第一步获取数据,第二部转换数据。
location 通过 row.getAs 获取,getAs 获取是一个 string 类型,传入 field,对location 进行转换,通过 map 算子转换,将 loc 转成其他类型
def parseLocation(row: RichRow,field: string): Double = {
//1.获取数据
val location = row.getAs[ string](field)
// 2.转换数据
val locationoption = location.map( loc=>loc.toDouble )locationoption.getorElse(
0.0D
)
完成转换逻辑,理解对应 option 的处理
Option 代表某个方法有可能为空,使得方法调用必须处理 null 的情况,option 对象本身提供对于 null 的支持