spark清洗过滤json格式

spark清洗过滤json格式

待处理数据内容如下
在这里插入图片描述
将该文件上传至hdfs

[root@hadoop30 kb09file]# hdfs dfs -put /opt/kb09file/op.log /kb09file

在这里插入图片描述
验证是否上传成功

[root@hadoop30 kb09file]# hdfs dfs -ls /kb09file

在这里插入图片描述
启动spark-shell

[root@hadoop30 kb09file]# spark-shell

从hdfs查看op.log文件内容

sc.textFile("hdfs://hadoop30:9000/kb09file/op.log").collect.foreach(println)

在这里插入图片描述
从hdfs读取op.log文件

val fileRDD=sc.textFile("hdfs://hadoop30:9000/kb09file/op.log")

使用split以 | 分隔

val jsonStrRDD=fileRDD.map(x=>x.split('|')).map(x=>(x(0),x(1)))

进行字符串拼接

val jsonRDD=jsonStrRDD.map(x=>{var jsonStr=x._2; jsonStr=jsonStr.substring(0,jsonStr.length-1);jsonStr+",\"id\":\""+x._1+"\"}"})

转成dataframe

val jsonDF=jsonRDD.toDF
jsonDF.printSchema

在这里插入图片描述

jsonDF.show

在这里插入图片描述
导入需要的包

import org.apache.spark.sql.types._
import org.apache.spark.sql.functions._

通过get_json_object获取对象cm,ap,et,id

val jsonDF2=jsonDF.select(get_json_object($"value","$.cm").alias("cm"),get_json_object($"value","$.ap").alias("ap"),get_json_object($"value","$.et").alias("et"),get_json_object($"value","$.id").alias("id"))

在这里插入图片描述
通过get_json_object进一步获取对象id,ap,ln,sv,os,g,mid,nw,l,vc,hw,ar,uid,t,la,md,vn,ba,sr,et

val jsonDF3=jsonDF2.select($"id",$"ap",get_json_object($"cm","$.ln").alias("ln"),get_json_object($"cm","$.sv").alias("sv"),get_json_object($"cm","$.os").alias("os"),get_json_object($"cm","$.g").alias("g"),get_json_object($"cm","$.mid").alias("mid"),get_json_object($"cm","$.nw").alias("nw"),get_json_object($"cm","$.l").alias("l"),get_json_object($"cm","$.vc").alias("vc"),get_json_object($"cm","$.hw").alias("hw"),get_json_object($"cm","$.ar").alias("ar"),get_json_object($"cm","$.uid").alias("uid"),get_json_object($"cm","$.t").alias("t"),get_json_object($"cm","$.la").alias("la"),get_json_object($"cm","$.md").alias("md"),get_json_object($"cm","$.vn").alias("vn"),get_json_object($"cm","$.ba").alias("ba"),get_json_object($"cm","$.sr").alias("sr"),$"et")
jsonDF3.show 

在这里插入图片描述
通过StructType和StructField查询jsonDF3里的ett,en,kv字段内容

jsonDF3.select(from_json($"et",ArrayType(StructType(StructField("ett",StringType)::StructField("en",StringType)::StructField("kv",StringType)::Nil)))alias("event")).show(false)

在这里插入图片描述
查询id,ap,ln,sv,os,g,mid,nw,l,vc,hw,ar,uid,t,la,md,vn,ba,sr,ett,en,kv字段内容

val jsonDF4 = jsonDF3.select($"id",$"ap",$"ln",$"sv",$"os",$"g",$"mid",$"nw",$"l",$"vc",$"hw",$"ar",$"uid",$"t",$"la",$"md",$"vn",$"ba",$"sr",from_json($"et",ArrayType(StructType(StructField("ett",StringType)::StructField("en",StringType)::StructField("kv",StringType)::Nil))).alias("event"))
val jsonDF5=jsonDF4.select($"id",$"ap",$"ln",$"sv",$"os",$"g",$"mid",$"nw",$"l",$"vc",$"hw",$"ar",$"uid",$"t",$"la",$"md",$"vn",$"ba",$"sr",explode($"event").alias("event"))
val jsonDF6=jsonDF5.select($"id",$"ap",$"ln",$"sv",$"os",$"g",$"mid",$"nw",$"l",$"vc",$"hw",$"ar",$"uid",$"t",$"la",$"md",$"vn",$"ba",$"sr",$"event.ett",$"event.en",$"event.kv")
jsonDF6.show(false)

在这里插入图片描述
过滤en里为loading的内容

val jsonDF7=jsonDF6.filter(jsonDF6("en")==="loading").select($"id",$"ap",$"ln",$"sv",$"os",$"g",$"mid",$"nw",$"l",$"vc",$"hw",$"ar",$"uid",$"t",$"la",$"md",$"vn",$"ba",$"sr",$"ett",$"en",$"kv")
jsonDF7.show(false)

在这里插入图片描述
通过ArrayType,StructType,StructField进一步获取kv中的对象内容

val jsonDF8=jsonDF7.select($"id",$"ap",$"ln",$"sv",$"os",$"g",$"mid",$"nw",$"l",$"vc",$"hw",$"ar",$"uid",$"t",$"la",$"md",$"vn",$"ba",$"sr",$"ett",$"en",from_json($"kv",ArrayType(StructType(StructField("extend2",StringType)::StructField("loading_time",StringType)::StructField("action",StringType)::StructField("extend1",StringType)::StructField("type",StringType)::StructField("type1",StringType)::StructField("loading_way",StringType)::Nil))).alias("kv"))
jsonDF8.show(false)

在这里插入图片描述

### Spring Boot 整合 Spark 进行数据清洗 #### 配置环境 为了使Spring Boot能够与Spark协作完成数据清洗工作,首先需要配置好相应的开发环境。这包括引入必要的依赖项以及设置合理的应用属性。 对于Maven项目而言,在`pom.xml`文件内添加如下依赖以支持Spark核心库和相关工具集[^5]: ```xml <dependencies> <!-- Other dependencies --> <dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-core_2.12</artifactId> <version>${spark.version}</version> </dependency> <dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-sql_2.12</artifactId> <version>${spark.version}</version> </dependency> </dependencies> ``` 同时,在`application.properties`或`application.yml`中定义一些默认参数用于连接集群或其他资源: ```yaml spring: datasource: url: jdbc:mysql://localhost:3306/testdb?useSSL=false&serverTimezone=UTC username: root password: password spark: master: local[*] app-name: DataCleaningApp ``` #### 创建服务层逻辑 接着创建一个名为`DataCleaningService.java`的服务类负责执行实际的数据清理任务。这里假设已经通过网络爬虫获取到了一批原始HTML文档作为待处理对象并存储在一个目录下等待进一步加工转换成为干净可用的信息集合体。 ```java @Service public class DataCleaningService { private final Logger logger = LoggerFactory.getLogger(DataCleaningService.class); @Value("${spark.master}") String sparkMaster; @Value("${spark.app-name}") String appName; public void cleanDataFromHtmlFiles(String inputPath, String outputPath) { try (JavaSparkContext sc = new JavaSparkContext(sparkMaster, appName)) { // Load HTML files into an RDD of strings. JavaRDD<String> htmlDocuments = sc.textFile(inputPath); // Perform data cleaning operations on the loaded documents here... JavaRDD<CleanedDocument> cleanedDocs = htmlDocuments.map(doc -> { CleanedDocument cd = new CleanedDocument(); // Implement your own parsing and cleansing logic return cd; }); // Save results to specified output path as JSON format or any other preferred formats. cleanedDocs.saveAsTextFile(outputPath); logger.info("Data cleaning completed successfully."); } catch (Exception e) { throw new RuntimeException(e.getMessage(), e); } } } ``` 上述代码片段展示了如何利用Spark的分布式计算能力加载大量文本文件,并对其进行简单的映射变换操作来模拟一次典型的数据预处理流程;当然具体到不同场景可能还需要更复杂的算法模型来进行特征提取、噪声过滤等工作。 #### 启动时自动运行数据清洗作业 为了让整个过程更加自动化,可以在应用程序启动之后立即触发该批处理程序。为此只需简单修改主函数中的入口点即可实现这一目标: ```java @SpringBootApplication public class YourApplication { @Autowired private DataCleaningService dataCleaningService; public static void main(String[] args) throws Exception{ ConfigurableApplicationContext context = SpringApplication.run(YourApplication.class, args); YourApplication app = context.getBean(YourApplication.class); app.startDataCleaningJob(); } @PostConstruct public void startDataCleaningJob(){ String inputDir = "/path/to/html/files"; String outputDir = "/path/to/output/directory"; this.dataCleaningService.cleanDataFromHtmlFiles(inputDir,outputDir); } } ``` 这样当服务器重启或者首次部署完成后就会立刻调用预先编写好的方法去同步更新最新的业务状态信息至下游系统之中去了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值