用例一:数据清洗
基本步骤:
- 1、读入日志文件并转化为RDD[Row]类型
按照Tab切割数据
过滤掉字段数量少于8个的 - 2、对数据进行清洗
按照第一列和第二列对数据进行去重
过滤掉状态码非200
过滤掉event_time为空的数据
将url按照”&”以及”=”切割 - 3、保存数据
将数据写入mysql表中
日志拆分字段:
event_time
url
method
status
sip
user_uip
action_prepend
action_client
如下是日志中的一条数据按照Tab分隔后的示例,每一行代表一个字段,分别以上一一对应
1、读入日志文件并转化为RDD[Row]类型
按照Tab切割数据
过滤掉字段数量少于8个的
val spark = SparkSession.builder().master("local[*]")
.appName("DataClear").getOrCreate()
val sc = spark.sparkContext
import spark.implicits._
val linesRdd = sc.textFile("in/test.log")
//按照Tab切割数据
// 过滤掉字段数量少于8个的
val rdd = linesRdd.map(x=>x.split("\t"))
.filter(x => x.length == 8)
.map(x => Row(x(0).trim,x(1).trim,x(2).trim,x(3).trim,x(4).trim,x(5).trim,x(6).trim,x(7).trim))
val schema = StructType(
Array(
StructField("event_time", StringType,false),
StructField("url", StringType,false),
StructField("method", StringType,false),
StructField("status", StringType,false),
StructField("sip", StringType,false),
StructField("user_uip", StringType,false),
StructField("action_prepend", StringType,false),
StructField("action_client", StringType,false)
)
)
val orgDF = spark.createDataFrame(rdd,schema)
2、对数据进行清洗
按照第一列和第二列对数据进行去重
过滤掉状态码非200
过滤掉event_time为空的数据
// 按照第一列和第二列对数组进行去重; 过滤掉状态码非200; 过滤掉event_time为空的数据
val ds1 = orgDF.dropDuplicates("event_time", "url")
.filter(x => x(3) == "200")
.filter(x => StringUtils.isNotEmpty(x(0).toString))
将url按照”&”以及”=”切割
//先将url按照”?”切割
val dfDetail = ds1.map(row =></