如何创建通用正则表达式,以便可以在scala spark中提取所有组结果

用户名

我们有.txt日志文件,我使用scala spark来读取该文件。该文件按行包含数据集。我如下一一读取数据

val sc = spark.SparkContext
val dataframe = sc.textFile(/path/to/log/*.txt)

主要是所有日志文件中的数据是三种类型,如下所示之一

ManagedElement=LNJ05193B,ENodeBFunction=1,RadioBearerTable=default,DataRadioBearer=1 dlMaxRetxThreshold 8   LNJ05193B   dlMaxRetxThreshold  8
ManagedElement=LNJ05024D,ENodeBFunction=1,EUtranCellFDD=DNJ05024D31 enableServiceSpecificHARQ false DNJ05024D31 enableServiceSpecificHARQ   FALSE
ManagedElement=LNJ05024D,ENodeBFunction=1,EUtranCellFDD=LNJ05024D31 primaryUpperLayerInd OFF    LNJ05024D31 primaryUpperLayerInd    OFF

第二种类型的线就是这种类型

ManagedElement=LNJ05024D,ENodeBFunction=1,EUtranCellFDD=BNJ05024D31,EUtranFreqRelation=5035 connectedModeMobilityPrio 7 LNJ05024D   5035    connectedModeMobilityPrio

和一些原始行如下:

ManagedElement=LNJ05147D,ENodeBFunction=1,EUtranCellFDD=LNJ05147D11,EUtranFreqRelation=2250,EUtranCellRelation=310260-51992-1 cellIndividualOffsetEUtran 0  LNJ05147D11 2250    310260  cellIndividualOffsetEUtran  0

我尝试制作一个包含以上所有记录的通用csv文件,如下所示

在所有类型的行中,共同的部分是Mana =和ENF =,因此要使用正则表达式,例如

val regx_first_exp = """"Manag=(\w*).*ENF=(\w),.*""".r

最后两个词是关键值,可以如下提取

val last_two = """(\w+)=(\w+[^=])"""".r

在两者之间,我尝试在不同的等式to(= sign)之后提取值,如果没有匹配项,则想要放入不同的列中,而不是在特定的列中简单地放置空值。

最终出来像:

+--------------+-----------+---------------+--------------+--------------------------+----------+
|managedElement|cellFDD    |targetFrequency|targetCell    |paramName                 |paramValue|
+--------------+-----------+---------------+--------------+--------------------------+----------+
|LNJ05025D     |DNJ05025D31|AWS_2087       |null          |threshXHighQ              |0         |
|LNJ05024D     |BNJ05024D31|5035           |null          |connectedModeMobilityPrio |7         |
|LNJ05193B     |null       |null           |null          |dlMaxRetxThreshold        |8         |
|LNJ05024D     |DNJ05024D31|null           |null          |enableServiceSpecificHARQ |false     |
|LNJ05024D     |LNJ05024D31|null           |null          |primaryUpperLayerInd      |OFF       |
|LNJ05147D     |LNJ05147D11|2250           |310260-51992-1|cellIndividualOffsetEUtran|0         |
+--------------+-----------+---------------+--------------+--------------------------+----------+

我们可以在单个正则表达式或多个udf函数中与最小过滤器一样多吗?

我是Scala的新手,请提供相同的建议。图像中的最后一列仅用于一种行的类型,一一提到。

复活

这里是一个解决方案,使用模式匹配正则表达式的4个不同的正则表达式表达作品解释在这里

val df = Seq(
 ("ManagedElement=LNJ05025D,ENodeBFunction=1,EUtranCellFDD=DNJ05025D31,UtranFreqRelation=AWS_2087 threshXHighQ 0"),
 ("ManagedElement=LNJ05024D,ENodeBFunction=1,EUtranCellFDD=BNJ05024D31,EUtranFreqRelation=5035 connectedModeMobilityPrio 7"),
 ("ManagedElement=LNJ05193B,ENodeBFunction=1,RadioBearerTable=default,DataRadioBearer=1 dlMaxRetxThreshold 8"),
 ("ManagedElement=LNJ05024D,ENodeBFunction=1,EUtranCellFDD=DNJ05024D31 enableServiceSpecificHARQ false"),
 ("ManagedElement=LNJ05024D,ENodeBFunction=1,EUtranCellFDD=LNJ05024D31 primaryUpperLayerInd OFF"),
 ("ManagedElement=LNJ05147D,ENodeBFunction=1,EUtranCellFDD=LNJ05147D11,EUtranFreqRelation=2250,EUtranCellRelation=310260-51992-1 cellIndividualOffsetEUtran 0")
).toDF("logs")

case class LogItem(managedElement: String, cellFDD: String, targetFrequency: String, targetCell: String, paramName: String, paramValue: String)

// 1st type: ManagedElement=LNJ05025D,ENodeBFunction=1,EUtranCellFDD=DNJ05025D31,UtranFreqRelation=AWS_2087 threshXHighQ 0
// extract 5 groups
val log1RegExpr = """^ManagedElement=(\w+).*EUtranCellFDD=(\w+).*tranFreqRelation=(\w+)\s(\w+)\s(\w+)$""".r

// 2nd type: ManagedElement=LNJ05193B,ENodeBFunction=1,RadioBearerTable=default,DataRadioBearer=1 dlMaxRetxThreshold 8
// extract 3 groups
val log2RegExpr = """^ManagedElement=(\w+).*\s(\w+)\s(\w+)$""".r

// 3rd type: ManagedElement=LNJ05024D,ENodeBFunction=1,EUtranCellFDD=DNJ05024D31 enableServiceSpecificHARQ false
// extract 4 groups
val log3RegExpr = """^ManagedElement=(\w+).*EUtranCellFDD=(\w+)\s(\w+)\s(\w+)$""".r

// 4th type: ManagedElement=LNJ05147D,ENodeBFunction=1,EUtranCellFDD=LNJ05147D11,EUtranFreqRelation=2250,EUtranCellRelation=310260-51992-1 cellIndividualOffsetEUtran 0
// extract 6 groups
val log4RegExpr = """^ManagedElement=(\w+).*EUtranCellFDD=(\w+).*tranFreqRelation=(\w+).*EUtranCellRelation=(\S+)\s(\w+)\s(\w+)$""".r

df.map{row =>
  row.getString(0) match {
    case log4RegExpr(me, cf, tf, tc, pn, pv) => LogItem(me, cf, tf, tc, pn, pv)
    case log1RegExpr(me, cf, tf, pn, pv) => LogItem(me, cf, tf, null, pn, pv)
    case log3RegExpr(me, cf, pn, pv) => LogItem(me, cf, null, null, pn, pv)
    case log2RegExpr(me, pn, pv) => LogItem(me, null, null, null, pn, pv)
    case _ => throw new Exception("Invalid format")
  }
}.show(false)

并输出:

+--------------+-----------+---------------+--------------+--------------------------+----------+
|managedElement|cellFDD    |targetFrequency|targetCell    |paramName                 |paramValue|
+--------------+-----------+---------------+--------------+--------------------------+----------+
|LNJ05025D     |DNJ05025D31|AWS_2087       |null          |threshXHighQ              |0         |
|LNJ05024D     |BNJ05024D31|5035           |null          |connectedModeMobilityPrio |7         |
|LNJ05193B     |null       |null           |null          |dlMaxRetxThreshold        |8         |
|LNJ05024D     |DNJ05024D31|null           |null          |enableServiceSpecificHARQ |false     |
|LNJ05024D     |LNJ05024D31|null           |null          |primaryUpperLayerInd      |OFF       |
|LNJ05147D     |LNJ05147D11|2250           |310260-51992-1|cellIndividualOffsetEUtran|0         |
+--------------+-----------+---------------+--------------+--------------------------+----------+

如您所见,在匹配给定表达式之一之后,我们返回了案例类LogItem的实例。

这里有两件事要注意:

  1. 您应谨慎保持上述匹配大小写的顺序,从较大(要提取的更多匹配项)到较小(较少的匹配项),否则log4可能属于log2类别,因为仍然存在匹配项!

  2. 从您的示例中看来,EUtranCellRelation包含特殊字符,因此需要\S+(非空格字符)而不是\w

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在Scala中使用正则表达式从字符串中提取所有标记

来自分类Dev

在通用Lisp中提取正则表达式匹配

来自分类Dev

如何在 PySpark 数据帧中提取正则表达式模式的所有实例?

来自分类Dev

如何在正则表达式中捕获n个组,以便我可以在js中替换它们

来自分类Dev

在 Scala 中提取正则表达式之后的元素

来自分类Dev

从多个正则表达式命名组中提取

来自分类Dev

从正则表达式中提取组

来自分类Dev

在正则表达式匹配中提取组

来自分类Dev

使用Scala正则表达式提取匹配组

来自分类Dev

使用Scala正则表达式提取内部组

来自分类Dev

如何使用正则表达式在Scala中提取匹配字符串?

来自分类Dev

Scala正则表达式:从字符串中提取表达式

来自分类Dev

有没有人有向纯文本字符串添加转义字符的功能,以便可以在javascript的正则表达式中将其视为逐字记录?

来自分类Dev

正则表达式如何从括号中提取单词

来自分类Dev

正则表达式从中提取所有匹配值

来自分类Dev

正则表达式:从字符串中提取包含特定字母的所有元素

来自分类Dev

JMeter 从正则表达式中提取所有值并存储在 csv 中

来自分类Dev

正则表达式从 HTML、CSS 和 JavaScript 中提取所有图像文件

来自分类Dev

如何在一个正则表达式中捕获所有正则表达式组?

来自分类Dev

Swift正则表达式-如何提取匹配的组

来自分类Dev

正则表达式提取键组之间所有可能的字符组合

来自分类Dev

如何编写通用正则表达式以提取ExtractText中的数据?

来自分类Dev

如何在 Spark 中使用正则表达式从字符串列中提取日期

来自分类Dev

如何创建带有不确定数量的“命名正则表达式组”的“ urlpattern”

来自分类Dev

是否可以选择特定的正则表达式捕获组以在Pandas中创建列?

来自分类Dev

正则表达式可以从整行或仅到给定令牌创建一个组

来自分类Dev

如何使用正则表达式提取器或任何其他提取器(Xpath,Beanshell等)从下面给出的Json中提取所有Id值

来自分类Dev

捕获所有适合正则表达式的组

来自分类Dev

捕获所有适合正则表达式的组

Related 相关文章

  1. 1

    在Scala中使用正则表达式从字符串中提取所有标记

  2. 2

    在通用Lisp中提取正则表达式匹配

  3. 3

    如何在 PySpark 数据帧中提取正则表达式模式的所有实例?

  4. 4

    如何在正则表达式中捕获n个组,以便我可以在js中替换它们

  5. 5

    在 Scala 中提取正则表达式之后的元素

  6. 6

    从多个正则表达式命名组中提取

  7. 7

    从正则表达式中提取组

  8. 8

    在正则表达式匹配中提取组

  9. 9

    使用Scala正则表达式提取匹配组

  10. 10

    使用Scala正则表达式提取内部组

  11. 11

    如何使用正则表达式在Scala中提取匹配字符串?

  12. 12

    Scala正则表达式:从字符串中提取表达式

  13. 13

    有没有人有向纯文本字符串添加转义字符的功能,以便可以在javascript的正则表达式中将其视为逐字记录?

  14. 14

    正则表达式如何从括号中提取单词

  15. 15

    正则表达式从中提取所有匹配值

  16. 16

    正则表达式:从字符串中提取包含特定字母的所有元素

  17. 17

    JMeter 从正则表达式中提取所有值并存储在 csv 中

  18. 18

    正则表达式从 HTML、CSS 和 JavaScript 中提取所有图像文件

  19. 19

    如何在一个正则表达式中捕获所有正则表达式组?

  20. 20

    Swift正则表达式-如何提取匹配的组

  21. 21

    正则表达式提取键组之间所有可能的字符组合

  22. 22

    如何编写通用正则表达式以提取ExtractText中的数据?

  23. 23

    如何在 Spark 中使用正则表达式从字符串列中提取日期

  24. 24

    如何创建带有不确定数量的“命名正则表达式组”的“ urlpattern”

  25. 25

    是否可以选择特定的正则表达式捕获组以在Pandas中创建列?

  26. 26

    正则表达式可以从整行或仅到给定令牌创建一个组

  27. 27

    如何使用正则表达式提取器或任何其他提取器(Xpath,Beanshell等)从下面给出的Json中提取所有Id值

  28. 28

    捕获所有适合正则表达式的组

  29. 29

    捕获所有适合正则表达式的组

热门标签

归档