开发者学堂课程【大数据 Spark2020版(知识精讲与实战演练)第四阶段: 数据清洗_包装 Row 处理空值】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/691/detail/12111
数据清洗_包装 Row 处理空值
包装 Row 处理空值
进行具体的将 Row 转为 Trip,转换完成后 DataFrame 变成具体某一个强类型的 Dataset。
进入 idea 中
/**
*方法将 Row 转成 Trip
*/
转完 Trip 后,将 parse 传给 map 后,map 算子作用把所有的数据交给传入的函数,在函数里面进行转换,函数里面返回什么结果,rdd 就会转成什么样的形式。
只需要在 parse 中完成相应的转换操作
返回一个 Trip 类型数据,传入license,pickUpTime,dropOffTime,pickUpX,pickUpY,dropOffX,dropOffY,在 parse 函数前传入 license=
//4.转换操作
taxiRaw.rdd.map(parse)
}
/**
*方法将 Row 转成 Trip
*/
Def parse(row: Row): Trip={
val license=row.getAs[string](filedName=”hack_license”)
val pickUpTime=
val dropOffTime=
val pickUpX=
val pickUpY=
val dropOffX=
val dropOffY=Trip(license,pickUpTime,dropOffTime,pickUpX,pickUpY,dropOffX,dropOffY)
方法里面的过程是将一个数据转成对应类型的过程,license 从 row.getAs 中filedName=”hack_license”获取,在前面加上 string 表达 getAs 中结果是 string 类型
Parse 方法的流程即为此,将 Trip 当中所需要的字段都创建出来,从 row 中取出对应的字段做一些操作,放入对应的变量中,将变量传入进来
在 row.getAs 中,加入 hack_license 是一个空,getAs 也是空,进行此操作是,要知道那些地方为空,才有机会进行处理
先要判断 getAs 返回的内容是否为空,针对 license 进行判断,判断返回的结果是否为空,是空就要进行相应操作,返回另外一个值
val license=if (row.
getAs[string](filedName=”hack_license”)==null)””else row.getAs[string](filedName=”hack_license”
此处理需要写太多多余的代码
在 Scala 中对于空的支持使用 option
删掉代码
val license=row.getAs[string](filedName=”hack_license”)
将方法进行包装,在 Java 中有一个包装模式,将对象进行包装,重写一个 getAs,在重写的 getAs 中返回 option
创建 class,接收 row 对象,包装 getAs 方法,getAs 返回的结果是 option 结果,
class RichRow( row : Row) {
def getAs(): option = {
将val license=row.getAs[string](filedName=”hack_license”)
改为val richRow=new RichRow(row),底下通过 richRow 进行 getAs,返回 option 进行相应处理
val license=richRow.getAs()
getAs 返回结果要进行指定
val license=richRow.getAs[String]()
是一个 T 类型的 option
class RichRow( row : Row) {
def getAs[T](): option[T] = {
val value=row.getAs(field)
上面可以传上 hick_license
val license=richRow.getAs[string](filed=”hack_license”)
class RichRow( row : Row) {
def getAs[T](field:string): option[T] = {
val value=row.getAs(field)
//1.判断 row.getAs 是否为空,row 中对用的 field 是否为空
用 if 进行判断,判断对应的 field 为空,找到 row,row 是从外部传入的,row 中有一个方法 isNullAt,isNullAt 点进去是 i,通过 row 对象获取 Index,找到 field 对应的 Index,判断 row 中对应的位置是否为空
If(row.isNullAt(row.fieldIndex(field)))
//2.假如为空 null,返回 None
None
}else
//3.如果有内容 not null,返回 Some
Some(row.getAs[T](field))
RichRow 创建出来,RichRow 给外部使用
class RichRow( row : Row) {
def getAs[T](field:string): option[T] = {
val value=row.getAs(field)
//1.判断 row.getAs 是否为空,row 中对用的 field 是否为空
If(row.isNullAt(row.fieldIndex(field)))
//2.假如为空 null,返回 None
None
}else
//3.如果有内容 not null,返回 Some
Some(row.getAs[T](field))
是 RichRow 的一个分装,交给外部使用,在使用时,返回一个 option,没有的话做一个空
val license=richRow.getAs[string](filed=”hack_license”)ornull
对 row 的分装即 richrow,richrow 是 row 对象的分装类型,包装的方法为 getAs,getAs 方法的包装是为了返回 option,提醒外面处理空值,提供处理方式
RichRow 是 DataFrame 中的 Row 对象的包装类型,主要为了包装 getAs 方法
getAs 获取一个 option,ornull 代表有值就返回,设计给 license,没有即返回空
license 没有为空,在后面进行空值处理更加容易