如何处理blob数据包含在一个XML文件吗

学习如何处理blob数据包含在一个XML文件。

写的亚当Pavlacka

去年发表在:2022年3月4日

如果你日志事件的XML格式,那么每个XML事件记录为base64字符串。为了运行使用Apache火花,对这些数据的分析需要使用spark_xml图书馆和BASE64DECODER API将数据进行分析。

问题

你需要从xml格式的日志文件分析base64编码的字符串使用火花。例如,下面的文件input.xml显示了这种类型的格式:

< ?xml version = " 1.0 " encoding = " utf - 8 " ? > < !日志(< ! DOCTYPE实体%日志系统"实例" > %日志;]> <日志systemID =“MF2018时区”=“UTC时间戳= " Mon 2018年3月25日16:00:01 " > <消息来源= "消息。日志“时间= " Mon 2018年3月25日16:00:01 sysMSG“type = > <文本/ > <详细> < blob > aW5zdGFuY2VJZCxzdGFydFRpbWUsZGVsZXRlVGltZSxob3Vycw0KaS0wMjdmYTdjY2RhMjEwYjRmNCwyLzE3LzE3VDIwOjIxLDIvMTcvMTdUMjE6MTEsNQ0KaS0wN2NkNzEwMGUzZjU0YmY2YSwyLzE3LzE3VDIwOjE5LDIvMTcvMTdUMjE6MTEsNA0KaS0wYTJjNGFkYmYwZGMyNTUxYywyLzE3LzE3VDIwOjE5LDIvMTcvMTdUMjE6MTEsMg0KaS0wYjQwYjE2MjM2Mzg4OTczZiwyLzE3LzE3VDIwOjE4LDIvMTcvMTdUMjE6MTEsNg0KaS0wY2ZkODgwNzIyZTE1ZjE5ZSwyLzE3LzE3VDIwOjE4LDIvMTcvMTdUMjE6MTEsMg0KaS0wY2YwYzczZWZlZWExNGY3NCwyLzE3LzE3VDE2OjIxLDIvMTcvMTdUMTc6MTEsMQ0KaS0wNTA1ZTk1YmZlYmVjZDZlNiwyLzE3LzE3VDE2OjIxLDIvMTcvMTdUMTc6MTEsOA = = < / blob > < /细节> < /消息> < /日志>

解决方案

解析XML文件:

  1. 加载XML数据。
  2. 使用spark_xml图书馆和创建一个原始DataFrame
  3. 应用一个blob列使用base64解码BASE64DecoderAPI。
  4. 解码数据保存在一个文本文件(可选)。
  5. 加载文本文件使用火花DataFrame和解析。
  6. 创建DataFrame作为一个火花SQL表。

下面的Scala代码处理文件:

val xmlfile = " / mnt / <路径> /输入。xml“val readxml = spark.read.format (com.databricks.spark.xml) .option (“rowTag”、“消息”).load xmlfile val = readxml解码。selectExpr (“_source源”,“_time随着时间”、“_type类型”,“detail.blob”) decoded.show() / /显示原始blob数据/ / base64译码器适用于每一个blob数据如下所示val decodethisxmlblob =解码。抽样. map (str = > str (3) .toString) . map (str1 = >新字符串(新sun.misc.BASE64Decoder () .decodeBuffer (str1))) / /临时存储在一个文本文件decodethisxmlblob.saveAsTextFile (“/ mnt / vgiri / ec2blobtotxt”) / /使用火花DataFrame解析文本文件的要求。val readAsDF = spark.sparkContext.textFile (“/ mnt / vgiri / ec2blobtotxt”) val头= readAsDF.first () val finalTextFile = readAsDF。过滤器(行= >行! =头)val finalDF = finalTextFile.toDF () .selectExpr((“分裂(价值,”、“)[0]instanceId”),(“分裂(价值,”、“)[1]为开始时间”),(“分裂(价值,”、“)[2]deleteTime”),(“分裂(价值,”、“)[3]小时”))finalDF.show ()

火花代码生成以下输出:

18/03/24 22:54:31信息DAGScheduler: ResultStage 4(显示在SparkXMLBlob.scala: 42)在0.016秒完成18/03/24 22:54:31信息DAGScheduler: SparkXMLBlob工作完成4:显示。scala: 42岁,0.019120年代18/03/24 SparkContext 22:54:31信息:调用阻止()关闭钩+ - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - +——+ | instanceId |开始时间| deleteTime | + |小时- - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - +——+ |我- 027 fa7ccda210b4f4 | 2/17/17T20:21 | 2/17/17T21:11 | 5 | | i-07cd7100e3f54bf6a | 2/17/17T20:19 | 2/17/17T21:11 | 4 | | i-0a2c4adbf0dc2551c | 2/17/17T20:19 | 2/17/17T21:11 | 2 | | i-0b40b16236388973f | 2/17/17T20:18 | 2/17/17T21:11 | 6 | | i-0cfd880722e15f19e | 2/17/17T20:18 | 2/17/17T21:11 | 2 | | i-0cf0c73efeea14f74 | 2/17/17T16:21 | 2/17/17T17:11 | 1 | |我- 0505 e95bfebecd6e6 | 2/17/17T16:21 | 2/17/17T17:11 | | + 8 - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +


这篇文章有用吗?