Ho un set di dati molto grande che viene caricato in Hive. Consiste di circa 1,9 milioni di righe e 1450 colonne. Devo determinare la "copertura" di ciascuna colonna, ovvero la frazione di righe che hanno valori non NaN per ogni colonna.Contare il numero di voci non NaN in ogni colonna di Spark dataframe con Pyspark
Ecco il mio codice:
from pyspark import SparkContext
from pyspark.sql import HiveContext
import string as string
sc = SparkContext(appName="compute_coverages") ## Create the context
sqlContext = HiveContext(sc)
df = sqlContext.sql("select * from data_table")
nrows_tot = df.count()
covgs=sc.parallelize(df.columns)
.map(lambda x: str(x))
.map(lambda x: (x, float(df.select(x).dropna().count())/float(nrows_tot) * 100.))
Cercando questo fuori nella shell pyspark, se io poi faccio covgs.take (10), restituisce una piuttosto grande stack errori. Dice che c'è un problema in save nel file /usr/lib64/python2.6/pickle.py
. Questa è la parte finale dell'errore:
py4j.protocol.Py4JError: An error occurred while calling o37.__getnewargs__. Trace:
py4j.Py4JException: Method __getnewargs__([]) does not exist
at py4j.reflection.ReflectionEngine.getMethod(ReflectionEngine.java:333)
at py4j.reflection.ReflectionEngine.getMethod(ReflectionEngine.java:342)
at py4j.Gateway.invoke(Gateway.java:252)
at py4j.commands.AbstractCommand.invokeMethod(AbstractCommand.java:133)
at py4j.commands.CallCommand.execute(CallCommand.java:79)
at py4j.GatewayConnection.run(GatewayConnection.java:207)
at java.lang.Thread.run(Thread.java:745)
Se c'è un modo migliore per raggiungere questo obiettivo che il modo che sto cercando, io sono aperto a suggerimenti. Non posso usare panda, tuttavia, poiché non è attualmente disponibile nel cluster su cui lavoro e non ho i diritti per installarlo.
somma di ritorno (col (c) .isNotNull() cast ("integer").) Alias (c) qui lo fa. sa automaticamente quale dataframe accedere? È perché otteniamo i nomi delle colonne da quel particolare dataframe? – Roshini
@Roshini Le colonne sono significative solo in un ambito di specifica espressione SQL che definisce i collegamenti. Nel contesto di altre parole di un determinato 'select' definisce come vengono risolte le colonne. – zero323
@ zero323 Come gestiamo quando il suo nan invece di null? Ho notato che l'uso di df.na.replace (np.nan, 'NA') cambia nan a None Quindi questo sarà un modo corretto? Passaggio 1: utilizzare df.na.replace (np.nan, 'NA') per convertire nan in Nessuno Passaggio 2: applicare il metodo sul nuovo df per contare null. –