如何處理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 - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +