Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 如何创建泛型正则表达式,以便在scala spark中提取所有组结果_Regex_Scala_Apache Spark - Fatal编程技术网

Regex 如何创建泛型正则表达式,以便在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

我们有.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,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的一个实例

这里需要注意两件事:

  • 您应该谨慎地保持上面指定的匹配案例顺序,从较大的(提取更多的匹配)到较小的(更少的匹配),否则log4可能属于log2类别,因为仍然存在匹配

  • 从您的示例中可以看出,EUtranCellRelation似乎包含特殊字符,因此需要
    \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
    类?