Regex 如何创建泛型正则表达式,以便在scala spark中提取所有组结果
我们有.txt日志文件,我用scala spark读取该文件。该文件包含按行排列的数据集。我一个接一个地阅读数据,如下所示Regex 如何创建泛型正则表达式,以便在scala spark中提取所有组结果,regex,scala,apache-spark,Regex,Scala,Apache Spark,我们有.txt日志文件,我用scala spark读取该文件。该文件包含按行排列的数据集。我一个接一个地阅读数据,如下所示 val sc = spark.SparkContext val dataframe = sc.textFile(/path/to/log/*.txt) val last_two = """(\w+)=(\w+[^=])"""".r 所有日志文件中的数据主要有三种类型,如下所示 ManagedElement=LNJ05193B,ENodeBFunction=1,Radio
val sc = spark.SparkContext
val dataframe = sc.textFile(/path/to/log/*.txt)
val last_two = """(\w+)=(\w+[^=])"""".r
所有日志文件中的数据主要有三种类型,如下所示
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文件,其中包含上述所有记录,如下所示
val sc = spark.SparkContext
val dataframe = sc.textFile(/path/to/log/*.txt)
val last_two = """(\w+)=(\w+[^=])"""".r
在所有类型的行中,公共部分是Mana=和ENF=所以要得到它,需要使用正则表达式,如
val regx_first_exp = """"Manag=(\w*).*ENF=(\w),.*""".r
最后两个字是键值,可以按如下方式提取
val sc = spark.SparkContext
val dataframe = sc.textFile(/path/to/log/*.txt)
val last_two = """(\w+)=(\w+[^=])"""".r
在这两者之间,我尝试在不同的列中提取eqal to(=符号)之后的值,如果在特定的列中没有比简单的put null值匹配的值,那么我希望将其放入不同的列中
最终结果如下:
+--------------+-----------+---------------+--------------+--------------------------+----------+
|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 ThreshHighHQ 0”),
(“ManagedElement=LNJ05024D,ENodeBFunction=1,EUtranCellFDD=BNJ05024D31,EUtranFreqRelation=5035 connectedModeMobilityPrio 7”),
(“ManagedElement=LNJ05193B,ENodeBFunction=1,RadioBeareTable=default,DataRadioBearer=1 DLMaxRetxtThreshold 8”),
(“ManagedElement=LNJ05024D,ENodeBFunction=1,EUtranCellFDD=DNJ05024D31 enableServiceSpecificHARQ false”),
(“ManagedElement=LNJ05024D,ENodeBFunction=1,EUtranCellFDD=LNJ05024D31 PrimaryUpperLayerId关闭”),
(“ManagedElement=LNJ05147D,ENodeBFunction=1,EUtranCellFDD=LNJ05147D11,EUtranFreqRelation=2250,EUtranCellRelation=310260-51992-1 CellIndividualOffsetutran 0”)
).toDF(“日志”)
案例类登录项(managedElement:String,cellFDD:String,targetFrequency:String,targetCell:String,paramName:String,paramValue:String)
//第一种类型:ManagedElement=LNJ05025D,ENodeBFunction=1,EUtranCellFDD=DNJ05025D31,UtranFreqRelation=AWS_2087 ThreshHighHQ 0
//提取5组
val log1RegExpr=“”^ManagedElement=(\w+).*EUtranCellFDD=(\w+).*tranFreqRelation=(\w+)\s(\w+)\s(\w+)$”。r
//第二种类型:ManagedElement=LNJ05193B,ENodeBFunction=1,RadioBeareTable=default,DataRadioBearer=1 DLMaxRetxtThreshold 8
//提取3组
val log2RegExpr=“”^ManagedElement=(\w+).*\s(\w+)\s(\w+)$”。r
//第三种类型:ManagedElement=LNJ05024D,ENodeBFunction=1,EUtranCellFDD=DNJ05024D31 enableServiceSpecificHARQ false
//提取4组
val log3RegExpr=“”^ManagedElement=(\w+).*EUtranCellFDD=(\w+)\s(\w+)\s(\w+)$”。r
//第四种类型:ManagedElement=LNJ05147D,ENodeBFunction=1,EUtranCellFDD=LNJ05147D11,EUtranFreqRelation=2250,EUtranCellRelation=310260-51992-1 CellIndividualOffseteTran 0
//提取6组
val log4RegExpr=“”^ManagedElement=(\w+).*EUtranCellFDD=(\w+).*tranFreqRelation=(\w+).*EUtranCellRelation=(\S+)\S(\w+)\S(\w+)$”。r
df.map{row=>
row.getString(0)匹配{
案例log4RegExpr(me、cf、tf、tc、pn、pv)=>LogItem(me、cf、tf、tc、pn、pv)
案例log1RegExpr(me,cf,tf,pn,pv)=>LogItem(me,cf,tf,null,pn,pv)
案例log3RegExpr(me,cf,pn,pv)=>LogItem(me,cf,null,null,pn,pv)
案例log2RegExpr(me,pn,pv)=>LogItem(me,null,null,null,pn,pv)
case=>抛出新异常(“无效格式”)
}
}.show(假)
以及输出:
+--------------+-----------+---------------+--------------+--------------------------+----------+
|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的一个实例
这里需要注意两件事:
\S+
(非空格字符),而不是\w
您确定正则表达式是用于此目的的正确工具吗?通过某些正则表达式或UDF,用于匹配器或模式匹配器,除最后一个之外,列的映射将作为next
ManagedElement->ManagedElement,EUtranCellFDD->CellFDD,UtranFreqRelation->TargetFrequency,EUtranFreqRelation->TargetFrequency
?您能确认@user3840898吗?在提供的输出上,最后一个数据集也有ManagedElement=LNJ05147D
不是LNJ05147D11,对吗?这是复制粘贴错误吗?我认为您最初的方法是正确的。您需要的唯一一件事是分别处理这3种情况,可能是提供3种不同的正则表达式,这样您就可以对其中一种进行配置,例如:val log1RegExpr=s”“^ManagedElement=(\w+)。{new\u name}=(\w+)。\tranFreqRelation=(\w+)\s(\w+)\s(\w+)”.r
您好,先生,我在上述案例2019-11-05 20:32:51 MO-N信息通信法之前也有这些词;我们可以管理这个吗?在这种情况下,我们只需要将数据列设置为2019-11-05,将时间列设置为20:32:51 MO-N INFO,将其他列设置为COMUser ACT,那么您想提取另外两个字段吗?日期和时间?我想我不太明白。也许用更多的信息更新问题会更容易,比如-2019-11-08 07:15:35 MO-N INFO COMUser SET它们是否属于您需要提取它们的LogItem
类?