Apache Spark Enron DataSet - PullRequest
       65

Apache Spark Enron DataSet

0 голосов
/ 28 апреля 2020

Я пытаюсь проанализировать Enron DataSet на apache spark. Я хочу извлечь электронную почту от и до. Сначала создал и rdd, используя следующую функцию:

def utf8_decode_and_filter(rdd):
    def utf_decode(s):
        try:
            return str(s, 'utf-8')
        except:
            pass
    return rdd.map(lambda x: utf_decode(x[1])).filter(lambda x: x != None)

Вызывается вышеупомянутая функция с последовательностью искры

data = utf8_decode_and_filter(sc.sequenceFile('/user/ufac001/project1920/samples'))

Когда я делаю:

data.collect()

Я вижу данные как список строк с электронной почтой между сотрудниками. Я предполагаю, что это список строк

Теперь, чтобы извлечь тройки электронной почты. Я написал следующую функцию:

def xml_to_emails(s):
    print(s)
    emailed = []

    return s

rdd = data.flatMap(lambda x: xml_to_emails(x)).map(lambda word: (word, 1)).reduceByKey(lambda a,b:a+b)

Моя проблема: во-первых, я не могу извлечь электронную почту, потому что в функции xml_to_email print (s) ничего не выводит, когда я запускаю collect на rdd, я могу напечатать кортеж с буквой и номером.

Как мне извлечь письма с этого rdd?

Пожалуйста, будь мил, я новичок ie на свече

1 Ответ

0 голосов
/ 28 апреля 2020

Нашел подобное решение и использовал карту внутри flatmap

import re

def xml_to_emails(s):
    emailed = []
    FromEmail =re.search('From: (.*)\n', s).group(1).replace("\r","")#Can never be null

    #check if 
    fromemail=""
    fromDomain = FromEmail.split('@')[1]
    if "enron" in fromDomain:
        fromemail =FromEmail

    Date = re.search('Date:(.*)',s).group(1).replace("\r","") #can never be null



    ToEmail= re.search('To:(.*)',s).group(1).replace("\r","")#can never be null

    toemail=""
    toDomain = ToEmail.split('@')
    if len(toDomain)>1:
        if "enron" in toDomain[1]:
            toemail =ToEmail


    CCEmail = re.search('Cc:(.*)',s)#can be null
    if CCEmail is not None:
        CCEmail=CCEmail.group(1).replace("\r","")

    BCCEmail = re.search('Bcc:(.*)',s)#can be null

    if BCCEmail is not None:
        BCCEmail=BCCEmail.group(1).replace("\r","")
    return (fromemail,(toemail,CCEmail,BCCEmail),Date)

data = rdd.map(lambda x: xml_to_emails(x))#.map(lambda word: (word, 1)).reduceByKey(lambda a,b:a+b)

Мне удалось извлечь письма

...