我正在使用以下内容通过Spark阅读csv文件。
rdd=sc.textFile("emails.csv").map(lambda line: line.split(","))
我需要创建一个Spark DataFrame。
我已使用以下内容将此rdd转换为spark df:
dataframe=rdd.toDF()
但我需要在将rdd转换为df时指定df的架构。我试过这样做:(我只有2列文件和消息)
from pyspark import Row
email_schema=Row('file','message')
email_rdd=rdd.map(lambda r: email_schema(*r))
dataframe=sqlContext.createDataFrame(email_rdd)
然而,我收到错误: java.lang.IllegalStateException:输入行没有架构所需的预期值。需要2个字段,同时提供1个值。
我也试过用这个来读取我的csv文件:
rdd=sc.textFile("emails.csv").map(lambda line: line.split(",")).map(lambda line: line(line[0],line[1]))
我收到错误:TypeError:' list'对象不可调用
我尝试使用pandas将我的csv文件读入pandas数据框,然后将其转换为spark DataFrame,但我的文件太大了。
我还补充说:
bin/pyspark --packages com.databricks:spark-csv_2.10:1.0.3
使用以下内容阅读我的文件:
df=sqlContext.read.format('com.databricks.spark.csv').options(header='true').load('emails.csv')
我收到错误: java.io.IOException :(起始行1)在封装令牌完成之前达到EOF
我已经完成了其他几个相关的主题并尝试过如上所述。谁能解释一下我哪里出错了?
[在MacOSX上使用Python 2.7,Spark 1.6.2]
编辑:
前3行如下。我只需要提取电子邮件的内容。我该怎么做呢?
1 allen-p / _sent_mail / 1。 "消息ID:< 18782981.1075855378110.JavaMail.evans@thyme> 日期:2001年5月14日星期一16:39:00 -0700(PDT) 来自:phillip.allen@enron.com 致:tim.belden@enron.com 学科: 哑剧版:1.0 内容类型:text / plain;字符集= US-ASCII 内容传输编码:7位 X-From:Phillip K Allen X-To:Tim Belden X-CC: X-BCC: X-Folder:\ Phillip_Allen_Jan2002_1 \ Allen,Phillip K. \'39发送邮件 X-Origin:Allen-P X-FileName:pallen(非特权).pst
这是我们的预测"
2 allen-p / _sent_mail / 10。 "消息ID:< 15464986.1075855378456.JavaMail.evans@thyme> 日期:2001年5月4日星期五13:51:00 -0700(PDT) 来自:phillip.allen@enron.com 致:john.lavorato@enron.com 主题:回复: 哑剧版:1.0 内容类型:text / plain;字符集= US-ASCII 内容传输编码:7位 X-From:Phillip K Allen X-To:John J Lavorato X-CC: X-BCC: X-Folder:\ Phillip_Allen_Jan2002_1 \ Allen,Phillip K. \'39发送邮件 X-Origin:Allen-P X-FileName:pallen(非特权).pst
前往参加商务会议可以带走旅途中的乐趣。特别是如果你必须准备一个演示文稿。我建议在这里举行商业计划会议,然后在没有任何正式商务会议的情况下旅行。我甚至会尝试就是否有必要或必要的旅行获得一些诚实的意见。
就商务会议而言,我认为尝试和激发不同群体之间关于什么是有效的和什么不是有效的讨论会更有成效。主持人经常说话而其他人在等待轮到他们的时候很安静。如果以圆桌讨论形式举行会议可能会更好。
我对去哪儿的建议是奥斯汀。打高尔夫球,租一艘滑雪船和喷气式滑雪板。飞到某个地方需要花费太多时间。"
3 allen-p / _sent_mail / 100。 "消息ID:< 24216240.1075855687451.JavaMail.evans@thyme> 日期:2000年10月18日星期三03:00:00 -0700(PDT) 来自:phillip.allen@enron.com 致:leah.arsdall@enron.com 主题:Re:测试 哑剧版:1.0 内容类型:text / plain;字符集= US-ASCII 内容传输编码:7位 X-From:Phillip K Allen X-To:Leah Van Arsdall X-CC: X-BCC: X-Folder:\ Phillip_Allen_Dec2000 \ Notes文件夹\'发送邮件 X-Origin:Allen-P X-FileName:pallen.nsf
测试成功。方式去!!!"
答案 0 :(得分:0)
如果RDD适合内存,则:
rdd.toPandas().to_csv('emails.csv')
如果没有,请使用spark-csv作为您的spark版本:
rdd.write.format('com.databricks.spark.csv').save('emails.csv')
在上面的示例中:
rdd=....map(lambda line: line.split(",")).map(lambda line: line(line[0],line[1]))
你不想要:
rdd=....map(lambda line: line.split(",")).map(lambda line: (line[0], line[1]))
答案 1 :(得分:0)
如果你有一个庞大的文件,为什么不在块中使用pandas数据帧而不是一次性加载所有数据框,如:
import pandas as pd
df_pd = pd.read_csv('myfilename.csv',chunksize = 10000)
for i,chunk in enumerate(df1):
if i==0:
df_spark = sqlContext.createDataFrame(chunk)
else:
df_spark = df_spark.unionAll(sqlContext.createDataFrame(chunk))
df_spark将是您所需的火花数据帧。这是低效的,但它会起作用。对于其他一些实现方法,您可以参考这个question
的答案另一种可能的方法是使用rdd的inferSchema方法,但是您需要在csv文件中使用列名才能使其工作,请参阅this。 所以你可以这样做:
srdd = inferSchema(rdd)
email_rdd=rdd.map(lambda r: srdd(*r))
dataframe=sqlContext.createDataFrame(email_rdd)