将CSV文件内容导入pyspark数据框


13

如何将.csv文件导入pyspark数据帧?我什至尝试在Pandas中读取csv文件,然后使用createDataFrame将其转换为spark数据框,但是它仍然显示一些错误。有人可以指导我吗?另外,请告诉我如何导入xlsx文件?我正在尝试将csv内容导入pandas数据帧,然后将其转换为spark数据帧,但是它显示错误:

"Py4JJavaError" An error occurred while calling o28.applySchemaToPythonRDD. : java.lang.RuntimeException: java.lang.RuntimeException: Unable to instantiate org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClient 

我的代码是:

from pyspark import SparkContext 
from pyspark.sql import SQLContext 
import pandas as pd 
sqlc=SQLContext(sc) 
df=pd.read_csv(r'D:\BestBuy\train.csv') 
sdf=sqlc.createDataFrame(df) 

1
如果有错误消息,应将其发布;它很可能具有有助于调试情况的重要信息。
jagartner '16

我正在尝试将csv内容导入到pandas数据帧中,然后将其转换为spark数据帧....但是它显示类似“ Py4JJavaError”的错误,调用o28.applySchemaToPythonRDD时发生了错误。:java.lang.RuntimeException:java.lang.RuntimeException:无法实例化org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClient
2007年

我的代码是->从pyspark导入pyspark.sql的SparkContext导入SQLContext的pd导入熊猫(df)---->错误
neha

1
欢迎来到DataScience.SE!请编辑您的原始帖子,而不要添加评论。
Emre'8

文件路径必须在HDFS中,然后只有您才能运行数据
Prakash Reddy

Answers:


13

“如何将.csv文件导入pyspark数据帧?” -有很多方法可以做到这一点;最简单的方法是使用Databrick的spark-csv模块启动pyspark。您可以通过以下方式启动pyspark:

pyspark --packages com.databricks:spark-csv_2.10:1.4.0

那么您可以按照以下步骤操作:

from pyspark.sql import SQLContext
sqlContext = SQLContext(sc)

df = sqlContext.read.format('com.databricks.spark.csv').options(header='true', inferschema='true').load('cars.csv')

另一种方法是使用rdd读取文本文件

myrdd = sc.textFile("yourfile.csv").map(lambda line: line.split(","))

然后,转换数据,以使每个项目的格式都与架构正确(例如,整数,字符串,浮点数等)。您将要使用

>>> from pyspark.sql import Row
>>> Person = Row('name', 'age')
>>> person = rdd.map(lambda r: Person(*r))
>>> df2 = sqlContext.createDataFrame(person)
>>> df2.collect()
[Row(name=u'Alice', age=1)]
>>> from pyspark.sql.types import *
>>> schema = StructType([
...    StructField("name", StringType(), True),
...    StructField("age", IntegerType(), True)])
>>> df3 = sqlContext.createDataFrame(rdd, schema)
>>> df3.collect()
[Row(name=u'Alice', age=1)]

参考:http : //spark.apache.org/docs/1.6.1/api/python/pyspark.sql.html#pyspark.sql.Row

“另外,请告诉我如何导入xlsx文件?” -Excel文件不在“大数据”中;Spark适用于大型文件或数据库。如果您有一个大小为50GB的Excel文件,则说明您做错了。Excel甚至无法打开如此大小的文件;根据我的经验,超过20MB的所有内容都会被Excel淘汰。


我认为上面的RDD方法可能存在问题:字段可能包含换行符(尽管用双引号引起来),即 tools.ietf.org/html/rfc4180#section-2
flow2k

您可以使用工具将xlsx文件转换为csv(诸如gnumeric或open office api之类的东西)。那么您可以
照常

2

以下对我来说效果很好:

from pyspark.sql.types import *
schema = StructType([StructField("name", StringType(), True),StructField("age", StringType(), True)]
pd_df = pd.read_csv("<inputcsvfile>")
sp_df = spark.createDataFrame(pd_df, schema=schema)

1

我的本地目录中有一个文件“ temp.csv”。从那里,使用本地实例执行以下操作:

>>> from pyspark import SQLContext
>>> from pyspark.sql import Row
>>> sql_c = SQLContext(sc)
>>> d0 = sc.textFile('./temp.csv')
>>> d0.collect()
[u'a,1,.2390', u'b,2,.4390', u'c,3,.2323']
>>> d1 = d0.map(lambda x: x.split(',')).map(lambda x: Row(label = x[0], number = int(x[1]), value = float(x[2])))
>>> d1.take(1)
[Row(label=u'a', number=1, value=0.239)]
>>> df = sql_c.createDataFrame(d1)
>>> df_cut = df[df.number>1]
>>> df_cut.select('label', 'value').collect()
[Row(label=u'b', value=0.439), Row(label=u'c', value=0.2323)]

因此d0是我们发送到spark RDD的原始文本文件。为了创建数据帧,您需要像在创建d1时一样,将csv分开,并使每个条目成为Row类型。最后一步是从RDD制作数据帧。


0

您可以使用DataBricks的spark-csv软件包,它会自动为您完成很多事情,例如照顾标题,使用转义符,自动模式推断等。从Spark 2.0开始,有一个内置功能可以处理CSV。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.