我对pyspark编程比较陌生,因此寻找一种从databricks文件系统(dbfs)读取大量Outlook(.msg)文件的方法。在执行以下代码行时,我得到了一些垃圾unicode数据,如下面的输出所示:
rdd = sc.wholeTextFiles("dbfs:/......./*.msg")
输出:
[(u'dbfs:/........./file1.msg', u'\ufffd\ufffd\x11\u0871\x1a\ufffd\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00>\x00\x03\x00\ufffd\ufffd\t\x00\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00 \x00\x00\x00\x05\x00\x00\x00\ufffd\ufffd\ufffd\ufffd\x00\x00\x00\x00\x03\x00\x00\x00\ufffd\x00\x00\x00\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd')]
任何人都可以帮助我实现成对的RDD,其中“ key =电子邮件msg文件的路径”和“ value =电子邮件msg文件的内容”。 ?另外,是否可以使用其他功能来实现相同的功能?
答案 0 :(得分:1)
您应该首先将所有'.msg'格式的数据集转换(ETL)为某种火花可读格式,例如Avro,Parquet。然后在spark数据框中读取它。
这是伪代码:
有一个python包可以读取* .msg文件https://pypi.org/project/extract-msg/
使用此程序包并获取 msg 对象,并按如下所示获取每个属性
import extract_msg
msg = extract_msg.Message("path/to/msg/file.msg")
msg = extract_msg.Message(f)
msg_sender = msg.sender
msg_date = msg.date
msg_subj = msg.subject
msg_message = msg.body
然后从 msg 创建一个数据框,并使用fastparquet软件包将其写入镶木地板
from fastparquet import write
write('outfile.parquet', msgDF)
然后在pyspark中读取镶木地板文件
spark.read.parquet("outfile.parquet")