Вот одно решение, которое работает с 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 |
+--------------+-----------+---------------+--------------+--------------------------+----------+
Как видите, мы возвращаем экземпляр класса Case LogItem после сопоставления с одним из заданных выражений.
Здесь следует обратить внимание на две вещи:
Вы должны быть Осторожно придерживаться порядка совпадений, как указано выше, от большего (больше совпадений для извлечения) до меньшего (меньше совпадений), в противном случае log4 может попасть в категорию log2, так как совпадение все еще существует!
Из ваших примеров кажется, что EUtranCellRelation содержит специальные символы, поэтому вместо \w
требуется \S+
(без пробела).