数据清洗_包装 Row 处理空值|学习笔记

简介: 快速学习数据清洗_包装 Row 处理空值

开发者学堂课程【大数据 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 没有为空,在后面进行空值处理更加容易

相关文章
|
SQL 数据管理 网络安全
数据管理DMS操作报错合集之DMS的CPU使用率达到100%,如何解决
数据管理DMS(Data Management Service)是阿里云提供的数据库管理和运维服务,它支持多种数据库类型,包括RDS、PolarDB、MongoDB等。在使用DMS进行数据库操作时,可能会遇到各种报错情况。以下是一些常见的DMS操作报错及其可能的原因与解决措施的合集。
|
SQL Oracle 关系型数据库
|
Linux 测试技术 数据库
解决django与sqlite3不兼容报SQLite 3.9.0 or later is required (found 3.8.2)错的问题
解决django与sqlite3不兼容报SQLite 3.9.0 or later is required (found 3.8.2)错的问题
562 2
|
域名解析 网络协议 Linux
在Linux中,如何配置DNS服务器?
在Linux中,如何配置DNS服务器?
【烦人的问题】有一天发现VSCode中自己的鼠标选择老是跨行选择多段代码,怎么都改不回来,而且用alt+shift+鼠标都无法切换,肿么办?
【烦人的问题】有一天发现VSCode中自己的鼠标选择老是跨行选择多段代码,怎么都改不回来,而且用alt+shift+鼠标都无法切换,肿么办?
|
SQL NoSQL 前端开发
MySQL 连接数过多的处理方法合集 - Too many connections - 卡拉云
碰到`Can not connect to MySQL server. Too many connections”-mysql`错误着实令人抓狂。这基本等于失去了对 MySQL 的控制权。本教程将详细讲解多种处理此错误的方法。 sudo mysql -uroot -p ERROR 1040 (00000): Too many connections
23365 1
|
Shell 数据安全/隐私保护
Shell编程之循环语句与函数(for、while)
Shell编程之循环语句与函数(for、while)
Shell编程之循环语句与函数(for、while)
|
Oracle 关系型数据库 数据库
【DG】搭建DG时,报错:ORA-01017 invalid username password logon denied
【DG】搭建DG时,报错:ORA-01017 invalid username password logon denied
1280 0