Dataframe in Apache PySpark: tutorial completo [con esempi]

Pubblicato: 2020-02-27

Oggi impareremo a conoscere il DataFrame in Apache PySpark . Pyspark è uno dei migliori strumenti di data science nel 2020. Si chiama colonne di una raccolta distribuita di righe in Apache Spark. È molto simile alle tabelle o alle colonne nei fogli di Excel e anche simile alla tabella del database relazionale. PySpark DataFrame ha anche caratteristiche simili a RDD, che sono:

Distribuito: la natura di DataFrame e RDD è distribuita

Valutazioni pigre: l'esecuzione dell'attività non viene eseguita se l'azione non viene eseguita

Natura di immutabile: un'altra caratteristica simile di RDD / DataFrame è che non può essere modificato una volta creato. Ma si può applicare la trasformazione per trasformare RDD / DataFrame.

Sommario

Vantaggio di DataFrame

1. Supporta molti linguaggi diversi, come Java, Scala, R, Python, utile in termini di supporto API. Il supporto API per più linguaggi aiuta a lavorare con molti linguaggi di programmazione.

2. DataFrame supporta un'ampia gamma di origini dati e formati, che aiuta molto a utilizzare comodamente una diversa fonte di dati e il loro formato.

3. Una delle parti migliori di DataFrame è che può persino gestire Petabyte di dati, che è una notevole capacità di gestire dati così enormi.

4. Apache Spark comprende rapidamente lo schema di DataFrame con l'osservazione in Spark DataFrame. Nelle colonne denominate, l'Osservazione di Spark DataFrame è organizzata. In questo modo viene ottimizzato il piano di esecuzione delle query.

5. L'enorme volume di dati semistrutturati e strutturati può essere elaborato rapidamente perché è progettato per farlo DataFrames.

Installazione di Apache Spark

Apache Spark deve essere configurato nella macchina prima di poter essere utilizzato per le operazioni DataFrame. I dati possono essere gestiti con il supporto di DataFrame poiché supporta varie operazioni di DataFrame. Qui discuteremo alcune operazioni comuni di DataFrame.

La creazione di SparkContext è il primo passo nella programmazione di Apache. Per l'esecuzione di operazioni in un cluster, è necessario SparkContext. SparkContext spiega come accedere a un cluster. Mostra anche Spark sulla posizione per ottenere un cluster.

Leggi: Framework di apprendimento profondo

Quindi viene stabilita la connessione Apache Cluster. La sua creazione è già stata eseguita se si utilizza Spark Shell. L'altro modo, l'impostazione di configurazione, può essere fornita, inizializzata e importata per la creazione di SparkContext.

Si può usare questo codice per la creazione:

da pyspark importa SparkContext

sc = SparkContext()

Creazione DataFrame da file CSV

Una nuova libreria deve essere specificata nella shell di python in modo che il file CSV possa essere letto. Per fare ciò, il primo passaggio consiste nel scaricare l'ultima versione del pacchetto Spark-CSV ed eseguire l'estrazione del pacchetto nella directory principale di Spark. Successivamente, apriremo la shell di PySpark e il pacchetto dovrà essere incluso.

$ ./bin/pyspark –packages com.databricks:spark-csv_2.10:1.3.0

Ora il DataFrame verrà creato dopo che i dati sono stati letti dal file CSV.

train = sqlContext.load(source=”com.databricks.spark.csv”, path = 'PATH/train.csv', header = True, inferSchema = True)

test = sqlContext.load(source=”com.databricks.spark.csv”, percorso = 'PATH/test-comb.csv', header = True,inferSchema = True)

I file CSV di test e i file CSV di training si trovano nella posizione della cartella denominata PATH. Se l'intestazione è presente nel file CSV, verrà visualizzata come True. Per conoscere il tipo di dati in ciascuna colonna del frame di dati, utilizzeremo l'opzione inferSchema = True. Utilizzando l'opzione inferSchema = True, il rilevamento del tipo di dati di ciascuna colonna del frame di dati verrà rilevato automaticamente dal contesto SQL. Tutte le colonne verranno lette come una stringa Se non impostiamo inferSchema su true.

Leggi: Librerie Python per Machine Learning

Manipolazione di DataFrame

Ora qui vedremo come manipolare il Data Frame:

  • Conoscere il tipo di dati delle colonne

printSchema verrà utilizzato per vedere il tipo di colonna e il relativo tipo di dati. Ora lo schema verrà stampato in formato albero applicando printSchema().

train.printSchema()

Produzione:

radice

|– User_ID: intero (nullable = true)

|– ID_prodotto: stringa (nullable = true)

|– Sesso: stringa (nullable = true)

|– Età: stringa (nullable = true)

|– Occupazione: intero (nullable = true)

|– Categoria_Città: stringa (nullable = true)

|– Stay_In_Current_City_Years: stringa (nullable = true)

|– Stato_Matrimonio: intero (nullable = true)

|– Product_Category_1: intero (nullable = true)

|– Product_Category_2: intero (nullable = true)

|– Product_Category_3: intero (nullable = true)

|– Acquisto: intero (nullable = true)

Dopo la lettura del file csv, possiamo vedere che abbiamo ottenuto accuratamente il tipo di dati o lo schema di ciascuna colonna nel frame di dati.

  • Mostra la prima n osservazione

Per vedere la prima n osservazione, si può usare l'operazione con la testa. L'operazione alla testa di Pandas è la stessa dell'operazione alla testa di PySpark.

train.head(5)

Produzione:

[Riga(User_ID=1000001, Product_ID=u'P00069042′, Sesso=u'F', Età=u'0-17′, Occupazione=10, City_Category=u'A', Stay_In_Current_City_Years=u'2′, Stato_Matrimonio= 0, Product_Category_1=3, Product_Category_2=Nessuno, Product_Category_3=Nessuno, Acquisto=8370),

Riga(User_ID=1000001, Product_ID=u'P00248942′, Sesso=u'F', Età=u'0-17′, Occupazione=10, City_Category=u'A', Stay_In_Current_City_Years=u'2′, Marital_Status=0 , Product_Category_1=1, Product_Category_2=6, Product_Category_3=14, Acquisto=15200),

Riga(User_ID=1000001, Product_ID=u'P00087842′, Sesso=u'F', Età=u'0-17′, Occupazione=10, City_Category=u'A', Stay_In_Current_City_Years=u'2′, Stato_Matrimonio=0 , Product_Category_1=12, Product_Category_2=Nessuno, Product_Category_3=Nessuno, Acquisto=1422),

Riga(User_ID=1000001, Product_ID=u'P00085442′, Sesso=u'F', Età=u'0-17′, Occupazione=10, City_Category=u'A', Stay_In_Current_City_Years=u'2′, Stato_Matrimonio=0 , Product_Category_1=12, Product_Category_2=14, Product_Category_3=Nessuno, Acquisto=1057),

Riga(User_ID=1000002, Product_ID=u'P00285442′, Sesso=u'M', Età=u'55+', Occupazione=16, Categoria_città=u'C', Stay_In_Current_City_Years=u'4+', Stato_Matrimonio=0 , Product_Category_1=8, Product_Category_2=Nessuno, Product_Category_3=Nessuno, Acquisto=7969)]

Ora useremo l'operazione mostra per vedere il risultato in modo migliore perché i risultati arriveranno nel formato di riga. Possiamo anche troncare il risultato usando l'argomento truncate = True.

train.show(2,truncate= True)

Produzione:

+——-+———-+——+—-+———-+————-+————————–+————–+——————+ ——————+——————+——–+

|ID_utente|ID_prodotto|Sesso| Età|Occupazione|Categoria_città|Stay_In_Current_City_Years|Stato_matrimoniale|Categoria_prodotto_1|Categoria_prodotto_2|Categoria_prodotto_3|Acquisto|

+——-+———-+——+—-+———-+————-+————————–+————–+——————+ ——————+——————+——–+

|1000001| P00069042| F|0-17| 10| A| 2| 0| 3| nullo| nullo| 8370|

|1000001| P00248942| F|0-17| 10| A| 2| 0| 1| 6| 14| 15200|

+——-+———-+——+—-+———-+————-+————————–+————–+——————+ ——————+——————+——–+

mostrando solo le prime 2 righe

  • Conteggio del numero di righe di DataFrame

Per contare il numero di righe nel frame di dati, possiamo utilizzare l'operazione del conteggio. Ora conteremo il numero di righe di file di test e file di training applicando l'operazione di conteggio.

train.count(),test.count()

Produzione:

(233598, 550069)

Abbiamo rispettivamente 233598, 550069, righe in test e treno.

  • Ottenere il conteggio delle colonne e il nome delle colonne dal file di test e treno

Simile al funzionamento della colonna in DataFrame dei panda, utilizzeremo l'operazione delle colonne per ottenere il nome della colonna. Ora prima stamperemo il n. della colonna e il nome della colonna dal file di test e dal file del treno.

len(treno.colonne), treno.colonne

Produzione:

12 ['ID_utente', 'ID_prodotto', 'Sesso', 'Età', 'Occupazione', 'Categoria_Città', 'Anni_Città_Permanenti', 'Stato_Matrimonio', 'Categoria_Prodotto_1', 'Categoria_Prodotto_2', 'Categoria_Prodotto_3', 'Acquisto']

Ora lo stiamo facendo per il file di prova in modo simile.

len(test.colonne), test.colonne

Produzione:

13 [”, 'ID_utente', 'ID_prodotto', 'Sesso', 'Età', 'Occupazione', 'Categoria_Città', 'Stay_In_Current_City_Years', 'Stato_Matrimonio', 'Categoria_Prodotto_1', 'Categoria_Prodotto_2', 'Categoria_Prodotto_3', 'Comb ']

Dopo l'output sopra, possiamo vedere che ci sono 12 colonne nel file di training e 13 colonne nel file di test. Dall'output sopra, possiamo verificare di avere 13 colonne nel file di test e 12 nel file di training. La colonna "Comb" è l'unica colonna singola nel file di test e non è presente alcun "Acquisto" nel file di test. C'è un'altra colonna nel file di test che possiamo vedere che non ha alcun nome della colonna.

  • Ottenere le statistiche di riepilogo come conteggio, massimo, minimo, deviazione standard, media nelle colonne numeriche di DataFrame

Nel DataFrame, useremo l'operazione chiamata descrivere l'operazione. Possiamo fare il calcolo della colonna numerica e ottenere un riepilogo statistico utilizzando descrivi l'operazione. Tutte le colonne numeriche verranno calcolate nel DataFrame, non esiste un nome di colonna specificato nel calcolo delle statistiche di riepilogo.

train.describe().show()

Produzione:

+——-+——————+—————–+——————-+——————+——————+—————+—— ————+

|riepilogo| ID_utente| occupazione| Stato_Matrimonio|Categoria_Prodotto_1|Categoria_Prodotto_2|Categoria_Prodotto_3| Acquista|

+——-+——————+—————–+——————-+——————+——————+—————+—— ————+

| contare| 550068| 550068| 550068| 550068| 376430| 166821| 550068|

| media|1003028.8424013031|8.076706879876669|0.40965298835780306| 5.404270017525106| 9.842329251122386|12.668243206790512| 9263.968712959126|

| stddev|1727.5915855308265|6.522660487341778| 0.4917701263173273|3.9362113692014082| 5.086589648693526| 4.125337631575267|5023.0653938206015|

| min| 1000001| 0| 0| 1| 2| 3| 12|

| massimo| 1006040| 20| 1| 20| 18| 18| 23961|

+——-+——————+—————–+——————-+——————+——————+—————+—— ————+

Nell'operazione di descrizione, questo è ciò che otteniamo quando viene specificato il nome della colonna stringa o il nome della colonna categoriale.

train.describe('ID_prodotto').show()

Produzione:

+——-+———-+

|sommario|ID_prodotto|

+——-+———-+

| contare| 550068|

| significa | nullo|

| stddev| nullo|

| min| P00000142|

| massimo| P0099942|

+——-+———-+

Basato su ASCII, i valori massimi e minimi di calcolati. L'operazione Descrivi viene utilizzata per lavorare sulla colonna del tipo String.

  • Selezione della colonna di DataFrame

Useremo il nome delle colonne nell'operazione di selezione per selezionare la colonna. Menzioneremo il nome della colonna con la separazione usando le virgole. Ora vedremo come viene effettuata la selezione di "Età" e "ID_utente" dal file di allenamento.

  • train.select('User_ID','Età').show(5)
  • Produzione:
  • +——-+—-+
  • |ID_utente| Età|
  • +——-+—-+
  • |1000001|0-17|
  • |1000001|0-17|
  • |1000001|0-17|
  • |1000001|0-17|
  • |1000002| 55+|
  • +——-+—-+
  • Trovare distinto prodotto n. nei file di prova e nei file del treno

Per calcolare il DataFrame n. di righe distinte, useremo l' operazione distinta . Ora qui applicheremo un'operazione distinta per il calcolo di n. di prodotto distinto in test e file di treno.

train.select('ID_prodotto').distinct().count(),test.select('ID_prodotto').distinct().count()

Produzione:

(3633, 3492)

Abbiamo rispettivamente 3492 e 3633 prodotti distinti in file di test e di formazione. Ora sappiamo che nel file di addestramento abbiamo valori più distinti rispetto al file di test, come possiamo imparare dal risultato di output. Ora useremo l'operazione di sottrazione per scoprire le categorie Product_ID che non sono presenti nel file di training ma sono presenti nel file di test. Stessa cosa si può fare anche per tutte le caratteristiche del categoriale.

diff_cat_in_train_test=test.select('Product_ID').subtract(train.select('Product_ID'))

diff_cat_in_train_test.distinct().count()# Per un conteggio distinto

Produzione:

46

Quindi dal risultato di cui sopra, possiamo sapere che ci sono 47 diverse categorie, che non sono presenti nel file di allenamento ma sono presenti nel file di test. I dati verranno saltati o raccolti dal file di prova, che non è presente nel file del treno.

  • Calcolo della frequenza a coppie delle colonne categoriali?

Eseguiamo il calcolo della frequenza a coppie della colonna nel DataFrame utilizzando l'operazione can crosstab. Ora calcoliamo le colonne "Sesso" ed "Età" in DataFrame del treno applicando l' operazione di campi incrociati .

train.crosstab('Età', 'Sesso').show()

Produzione:

+———-+—–+——+

|Età_Sesso| F| M|

+———-+—–+——+

| 0-17| 5083| 10019|

| 46-50|13199| 32502|

| 18-25|24628| 75032|

| 36-45|27170| 82843|

| 55+| 5083| 16421|

| 51-55| 9894| 28607|

| 26-35|50752|168835|

+———-+—–+——+

Il valore distinto di Gender è il nome della colonna e la diversa quantità di Age è il nome della riga, che può essere visto nel risultato sopra. Nella tabella, il conteggio della coppia sarà zero se non si è verificato.

Come ottenere DataFrame con righe uniche?

Per trovare righe univoche e non per includere righe duplicate, utilizzeremo l'operazione dropDuplicates . Otterrà il Dataframe senza righe duplicate eliminando le righe duplicate di un DataFrame. Controlla qui per sapere come viene eseguita la procedura dropDuplicates per ottenere tutte le righe univoche per le colonne.

train.select('Età','Sesso').dropDuplicates().show()

Produzione:

+—–+——+

| Età|Sesso|

+—–+——+

|51-55| F|

|51-55| M|

|26-35| F|

|26-35| M|

|36-45| F|

|36-45| M|

|46-50| F|

|46-50| M|

| 55+| F|

| 55+| M|

|18-25| F|

| 0-17| F|

|18-25| M|

| 0-17| M|

+—–+——+

  • Come eliminare le righe avrà un valore nullo?

Se si vogliono eliminare tutte le righe che hanno un valore nullo, allora possiamo usare l'operazione chiamata operazione dropna . Per eliminare una riga da DataFrame, considera tre opzioni.

  • Sottoinsieme – è l'elenco di tutti i nomi delle colonne da considerare per l'operazione di eliminazione di colonne con valori nulli.
  • Thresh: aiuta a eliminare le righe con valori non nulli inferiori a Thresh. Per impostazione predefinita, non viene specificato nulla in questo.
  • Come: può essere utilizzato in due tipi: tutto o qualsiasi. Usando any, eliminerà la riga se qualsiasi valore nella riga è nullo. Usando tutto, diminuirà la riga se i valori di tutte le righe sono nulli.

Ora qui useremo tutte queste opzioni una per una per eliminare le righe che sono nulle usando le opzioni predefinite come subset, thresh, None for how, nessuno, any.

train.dropna().count()

Produzione:

166821

  • Come riempire i valori null di DataFrame con un numero costante?

Per riempire i valori nulli con la costante n. Useremo l'operazione fillna qui. Ci sono due parametri che devono essere considerati dall'operazione fillna per riempire i valori null.

  • subset: qui è necessario specificare le colonne da considerare per i valori di riempimento.
  • valore: qui possiamo menzionare l'importo da sostituire con quale valore, che può essere qualsiasi tipo di dati come string, float, int in tutte le colonne.

Qui riempiremo '-1' al posto dei valori null nel treno DataFrame.

train.fillna(-1).show(2)

Produzione:

+——-+———-+——+—-+———-+————-+————————–+————–+——————+ ——————+——————+——–+

|ID_utente|ID_prodotto|Sesso| Età|Occupazione|Categoria_città|Stay_In_Current_City_Years|Stato_matrimoniale|Categoria_prodotto_1|Categoria_prodotto_2|Categoria_prodotto_3|Acquisto|

+——-+———-+——+—-+———-+————-+————————–+————–+——————+ ——————+——————+——–+

|1000001| P00069042| F|0-17| 10| A| 2| 0| 3| -1| -1| 8370|

|1000001| P00248942| F|0-17| 10| A| 2| 0| 1| 6| 14| 15200|

+——-+———-+——+—-+———-+————-+————————–+————–+——————+ ——————+——————+——–+

mostrando solo le prime 2 righe

Conclusione

PySpark sta guadagnando slancio nel mondo dell'Intelligenza Artificiale e dell'apprendimento automatico. PySpark viene utilizzato per risolvere problemi di apprendimento automatico nel mondo reale. Puoi creare RDD da diverse origini dati sia esterne che esistenti ed eseguire tutti i tipi di trasformazioni su di esso. Spero che questo articolo sia stato informativo e sia stato in grado di fornirti approfondimenti sui dataframe PySpark.

Se sei curioso di conoscere PySpark e altri strumenti per la scienza dei dati, dai un'occhiata al Diploma PG in Data Science di IIIT-B e upGrad, creato per i professionisti che lavorano e offre oltre 10 casi di studio e progetti, workshop pratici pratici, tutoraggio con esperti del settore, 1 a 1 con mentori del settore, oltre 400 ore di apprendimento e assistenza al lavoro con le migliori aziende.

PySpark è più efficiente di Panda?

Sì, PySpark è più veloce di Panda e supera persino Panda in un test di benchmarking. In termini di base, Pandas esegue operazioni su una singola macchina, mentre PySpark esegue operazioni su più macchine. Se stai lavorando su un'applicazione di Machine Learning con un enorme set di dati, PySpark è l'opzione ideale, poiché può eseguire operazioni 100 volte più velocemente di Pandas. Grazie alla JVM, il linguaggio di programmazione Scala è 10 volte più veloce di Python per l'analisi e l'elaborazione dei dati. Quando il codice di programmazione Python viene utilizzato per effettuare chiamate alle librerie Spark, i risultati sono mediocri.

Quali sono alcuni degli svantaggi dell'utilizzo di Apache PySpark?

Spark non ha un proprio sistema di gestione dei file. A causa dell'alto costo della memoria aggiuntiva necessaria per far funzionare Spark, l'elaborazione in memoria potrebbe essere proibitiva. Quando utilizzano Apache Spark con Hadoop, gli sviluppatori incontrano difficoltà con i file compatti. I dati vengono ripetuti in batch in Spark, con ogni iterazione pianificata ed elaborata in modo indipendente. In Apache Spark, i dati sono divisi in batch più piccoli a un intervallo di tempo predeterminato. Di conseguenza, i criteri di finestra basati su record non saranno supportati da Apache. Fornisce invece criteri di finestra basati sul tempo.

In che modo Dataset, DataFrame e RDD sono diversi l'uno dall'altro?

RDD è una raccolta in cluster di elementi di dati distribuiti su più computer. I dati sono rappresentati tramite RDD, che sono una raccolta di oggetti Java o Scala. Un DataFrame è una raccolta di dati strutturata in colonne denominate distribuite su molti server. In un database relazionale, è concettualmente equivalente a una tabella. Il set di dati è un'estensione dell'API dataframe che offre la capacità dell'interfaccia di programmazione orientata agli oggetti e indipendente dai tipi dell'API RDD. Un DataFrame è una raccolta distribuita di dati, simile a un RDD, e non è modificabile. I dati sono strutturati in colonne con nome, simili a una tabella in un database relazionale, piuttosto che in un RDD. Quando si tratta di attività semplici come il raggruppamento di dati, RDD è più lento di Dataframe e Dataset. Ha una semplice API per eseguire attività aggregate. Può aggregare i dati più velocemente di RDD e set di dati.