开发者学堂课程【大数据 Spark 2020版(知识精讲与实战演练)第三阶段:缺少值处理_字符串缺失值】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/690/detail/12085
缺少值处理_字符串缺失值
使用 SparkSQL 处理异常字符串
两种处理方式:第一种,替换;第二种,过滤(丢弃)
打开最原始的数据集,如下图,这个数据集当中,可以看到是 NA,它并不是我们所说的 NAN。我们所说的 NAN,是 double 下的 NAN,代表的含义是 not a number。但是,这个 NA 就是一个字符串。
下面讲解遇到这种字符串的时候应该如何处理:
首先,创建出来我们的一个方法,这时处理方式也是两种,第一种是处理方式就是丢弃,第二种处理方式是替换。在进行丢弃操作之前应该先读取数据集。
第一步读取数据集,大家要注意这个数据集跟前面使用的 beijingpm_with_nan_csvVS 不同,这个里面存放的都是最原始的数据,比如说,如果某一列为 NAN,那这一列的这个数据,叫做 NA,是字符串。直接通过 spark.read 来进行读取,但是没有 spark,故把前面的 spark,直接移出去,刚才写过的 spark 放在最外层,如下所示:
class Nullprocessor {
@Test
def nullAndNaN( ): unit = {
// 1.创建 sparkSession
val spark = Sparksession.builder()
master( master = "local[6]")
appName( name = "null processor")
getorcreate()
变为:
class Nullprocessor {
// 1.创建 sparkSession
val spark = Sparksession.builder()
master( master = "local[6]")
appName( name = "null processor")
getorcreate()
@Test
def nullAndNaN( ): unit = {
代码:
@Test
def strprocessor(): unit = {
//读取数据集
val sourceDF = spark.read
option("header", value = true)
option(""inferschema", value = true)
csv( path = "dataset/BeijingPM20100101_20151231.csv")
在讲丢弃之前,先查看数据集大概形状
sourceDF.show ()
运行代码,数据集如下图:
PM_Dongsi 一列是字符串列,PM_Nongzhanguan 一列也是字符串列。
假如一行数据里有 NAN 就要丢弃,直接过滤掉 PM_Dongsi 中等于 NAN 的所有数据就可以,下面讲如何进行过滤:
// 1.丢弃
import spark .implicits.
sourceDF.where( condition = "PM_Dongsi -!= "NA" ) .show()
运行:如下图,PM_Dongsi 一列中已经没有 NA,变成了具体值。
如果想将 NA 替换成 NAN,或者替换成 double 当中的 NAN,应该怎么做:可以直接使用 sourceDFf.select。
探讨 select 里面如何写:在 sql 语句中可以进行 select 比如说 name,age,还可以写上 when…then…,最终可以写 else.
在 sql 语句当中,是可以使用 case 和 then 的, 在进行替换操作时也是可以使用 case 和 then,如何使用:
首先,在 select 当中另起一行,再接下来使用 when 函数,导入 org.apache.spark.sql.functions._
导入这样一个 function 后,就可以使用 when 函数。
// 2.替换
import org.apache. spark.sql.functions._
// select name,age,case
// when ... then ...
// when ... then ...
// else
sourceDF.select(
cols = "No as "id"", "year,"month,"day,"hour,'season,
when( condition = "PM_Dongsi ==="NA"",Double.NaN)
otherwise( value = "PM_Dongsi cast DoubleType)
as( alias = "pm")
).show()
}
当 PM_Dongsi 的值为 NA 时,替换为 NaN 样的 double 值;如果不是 NA,将正常的值转成 double 类型再进行 as。
Cast 是转换类型
}
运行结果:
除了以上两种处理字符串的方式外,还有一种方式
sourceDF.na.replace():
sourceDF.na.replace(col=“PM_Dongsi”,Map(“NA” >“NaN”,“NULL”>“null”)).show()
使用 replace 要注意:原类型和转换过后的类型必须一致