Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/316.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
Python 如何使用spark读取每个日志行以匹配正则表达式模式?_Python_Apache Spark_Pyspark - Fatal编程技术网

Python 如何使用spark读取每个日志行以匹配正则表达式模式?

Python 如何使用spark读取每个日志行以匹配正则表达式模式?,python,apache-spark,pyspark,Python,Apache Spark,Pyspark,下面的程序抛出一个错误 from pyparsing import Regex, re from pyspark import SparkContext sc = SparkContext("local","hospital") LOG_PATTERN ='(?P<Case_ID>[^ ;]+);(?P<Event_ID>[^ ;]+);(?P<Date_Time>[^ ;]+);(?P<Activity>[^;]+);(?P<Resourc

下面的程序抛出一个错误

from pyparsing import Regex, re
from pyspark import SparkContext
sc = SparkContext("local","hospital")
LOG_PATTERN ='(?P<Case_ID>[^ ;]+);(?P<Event_ID>[^ ;]+);(?P<Date_Time>[^ ;]+);(?P<Activity>[^;]+);(?P<Resource>[^ ;]+);(?P<Costs>[^ ;]+)'
logLine=sc.textFile("C:\TestLogs\Hospital.log").cache()
#logLine='1;35654423;30-12-2010:11.02;register request;Pete;50'
for line in logLine.readlines():
    match = re.search(LOG_PATTERN,logLine)
    Case_ID = match.group(1)
    Event_ID = match.group(2)
    Date_Time = match.group(3)
    Activity = match.group(4)
    Resource = match.group(5)
    Costs = match.group(6)
    print Case_ID
    print Event_ID  
    print Date_Time
    print Activity
    print Resource
    print Costs
从pyparsing导入Regex,re
从pyspark导入SparkContext
sc=SparkContext(“本地”、“医院”)
对数模式='(?P[^;]+);(?P[^;]+);(?P[^;]+);(?P[^;]+);(?P[^;]+);(?P[^;]+)'
logLine=sc.textFile(“C:\TestLogs\Hospital.log”).cache()
#logLine='1;35654423;30-12-2010:11.02;注册请求;皮特;50'
对于logLine.readlines()中的行:
匹配=重新搜索(对数模式,对数线)
Case_ID=match.group(1)
事件ID=匹配。组(2)
日期\时间=匹配组(3)
活动=匹配。组(4)
资源=匹配。组(5)
成本=匹配。组(6)
打印案例号
打印事件标识
打印日期和时间
印刷活动
打印资源
印刷成本
错误:

回溯(最近一次调用上次):文件 “C:/Spark/Spark-1.6.1-bin-hadoop2.4/bin/hospital2.py”,第7行,在 对于logLine.readlines()中的行:AttributeError:“RDD”对象没有属性“readlines”

如果我添加
open
函数来读取文件,则会出现以下错误:

回溯(最近一次调用上次):文件 “C:/Spark/Spark-1.6.1-bin-hadoop2.4/bin/hospital2.py”,第7行,在 f=open(logLine,“r”)类型错误:强制使用Unicode:需要字符串或缓冲区,找到RDD

似乎不知道如何逐行阅读并提取符合模式的单词。 如果我只传递一条logline
logline='1;35654423;30-12-2010:11.02;注册请求;皮特;50'
它可以工作。我是spark新手,只懂python的基础知识。请帮忙。

你把事情搞混了。 线路

logLine=sc.textFile("C:\TestLogs\Hospital.log")
创建RDD,而RDD没有readlines()方法。 请参见此处的RDDAPI:

可以使用collect()逐行检索RDD的内容。 readlines()是标准Python文件API的一部分,但在Spark中处理文件时通常不需要它。 您只需使用textFile()加载文件,然后使用RDDAPI处理它,请参见上面的链接

你把事情搞混了。 线路

logLine=sc.textFile("C:\TestLogs\Hospital.log")
创建RDD,而RDD没有readlines()方法。 请参见此处的RDDAPI:

可以使用collect()逐行检索RDD的内容。 readlines()是标准Python文件API的一部分,但在Spark中处理文件时通常不需要它。
您只需使用textFile()加载文件,然后使用RDDAPI处理它,请参见上面的链接

正如Matei所回答的,readlines()是Python API,sc.textFile将创建一个RDD,因此RDD没有属性readlines()的错误

如果必须使用Spark API处理文件,则可以在为模式创建的RDD上使用过滤器API,然后可以根据分隔符分割输出

举例如下:

    logLine = sc.textFile("C:\TestLogs\Hospital.log")
    logLine_Filtered = logLine.filter(lambda x: "LOG_PATTERN" in x)
    logLine_output  = logLine_Filtered(lambda a: a.split("<delimiter>")[0], a.split("<delimiter>")[1].....).collect()
logLine_output.first()
logLine=sc.textFile(“C:\TestLogs\Hospital.log”)
logLine_Filtered=logLine.filter(λx:x中的“LOG_模式”)
logLine_output=logLine_Filtered(lambda:a.split(“”[0],a.split(“”[1]…).collect()
logLine_output.first()

Dataframe会更好

正如Matei所回答的,readlines()是Python API,sc.textFile将创建一个RDD,因此RDD没有属性readlines()的错误

如果必须使用Spark API处理文件,则可以在为模式创建的RDD上使用过滤器API,然后可以根据分隔符分割输出

举例如下:

    logLine = sc.textFile("C:\TestLogs\Hospital.log")
    logLine_Filtered = logLine.filter(lambda x: "LOG_PATTERN" in x)
    logLine_output  = logLine_Filtered(lambda a: a.split("<delimiter>")[0], a.split("<delimiter>")[1].....).collect()
logLine_output.first()
logLine=sc.textFile(“C:\TestLogs\Hospital.log”)
logLine_Filtered=logLine.filter(λx:x中的“LOG_模式”)
logLine_output=logLine_Filtered(lambda:a.split(“”[0],a.split(“”[1]…).collect()
logLine_output.first()
数据帧会更好