Importa il contenuto del file CSV in frame di dati pyspark


12

Come posso importare un file .csv in frame di dati pyspark? Ho anche provato a leggere il file CSV in Pandas e poi a convertirlo in un scintilla dataframe usando createDataFrame, ma mostra ancora qualche errore. Qualcuno può guidarmi attraverso questo? Inoltre, per favore dimmi come posso importare un file xlsx? Sto cercando di importare contenuto CSV in frame di dati Panda e quindi convertirlo in frame di dati Spark, ma mostra l'errore:

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

Il mio codice è:

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
Se hai un messaggio di errore, dovresti pubblicarlo; molto probabilmente ha informazioni importanti per aiutare a eseguire il debug della situazione.
Jagartner,

Sto cercando di importare contenuti CSV in frame di dati Panda e poi convertirli in frame di dati Spark ... ma sta mostrando un errore simile a "Py4JJavaError" Si è verificato un errore durante la chiamata di o28.applySchemaToPythonRDD. : java.lang.RuntimeException: java.lang.RuntimeException: impossibile istanziare org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClient
neha

e il mio codice era -> da pyspark import SparkContext da pyspark.sql import SQLContext import panda as pd sqlc = SQLContext (sc) df = pd.read_csv (r'D: \ BestBuy \ train.csv ') sdf = sqlc.createDataFrame (df) ----> Errore
neha,

1
Benvenuti in DataScience.SE! Modifica il tuo post originale invece di aggiungere commenti.
Emre,

il percorso del file deve essere in HDFS quindi solo tu puoi eseguire i dati
Prakash Reddy

Risposte:


13

"Come posso importare un file .csv in frame di dati pyspark?" - ci sono molti modi per farlo; il più semplice sarebbe avviare pyspark con il modulo spark-csv di Databrick. Puoi farlo avviando pyspark con

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

quindi puoi seguire i seguenti passi:

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

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

L'altro metodo sarebbe leggere nel file di testo come un rdd usando

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

Quindi trasforma i tuoi dati in modo che ogni elemento sia nel formato corretto per lo schema (ad esempio Ints, String, Float, ecc.). Ti consigliamo di utilizzare

>>> 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)]

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

"Inoltre, per favore dimmi come posso importare il file xlsx?" - I file Excel non vengono utilizzati in "Big Data"; Spark è pensato per essere utilizzato con file o database di grandi dimensioni. Se hai un file Excel di 50 GB di dimensioni, allora stai facendo cose sbagliate. Excel non sarebbe nemmeno in grado di aprire un file di quelle dimensioni; dalla mia esperienza, qualsiasi cosa sopra 20 MB ed Excel muore.


Penso che ci possa essere un problema con l'approccio RDD sopra: i campi possono contenere newline (anche se racchiusi tra virgolette doppie), vale a dire, tools.ietf.org/html/rfc4180#section-2 .
flow2k

puoi usare strumenti per convertire i file xlsx in csv (cose come gnumeric o apis open office). allora puoi fare la scienza dei dati normalmente
vpathak il

2

Di seguito ha funzionato bene per me:

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

Ho nella mia directory locale un file "temp.csv". Da lì, usando un'istanza locale faccio quanto segue:

>>> 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)]

Quindi d0 è il file di testo non elaborato che inviamo a un spark RDD. Affinché tu possa creare un frame di dati, vuoi dividere il csv e rendere ogni voce un tipo di riga, come faccio quando creo d1. L'ultimo passaggio consiste nel creare il frame di dati dall'RDD.


0

Puoi usare il pacchetto spark-csv di DataBricks che fa molte cose per te automaticamente, come prendersi cura dell'intestazione, usare caratteri di escape, schema automatico inferendo eccetera. A partire da Spark 2.0 esiste una funzione integrata per gestire i CSV.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.