topandas - spark python example
¿Qué está haciendo realmente el método Spark DataFrame `toPandas`? (2)
El uso de algún contexto de chispa o método de contexto de colmena ( sc.textFile()
, hc.sql()
) para leer datos ''en la memoria'' devuelve un RDD, pero el RDD permanece en la memoria distribuida (memoria en los nodos de trabajador), no en la memoria el nodo maestro. Todos los métodos de RDD ( rdd.map()
, rdd.reduceByKey()
, etc.) están diseñados para ejecutarse en paralelo en los nodos de trabajador, con algunas excepciones. Por ejemplo, si ejecuta un método rdd.collect()
, termina copiando el contenido del rdd desde todos los nodos de trabajador a la memoria del nodo principal. Por lo tanto, pierde sus beneficios de cálculo distribuido (pero aún puede ejecutar los métodos rdd).
De forma similar con los pandas, cuando se ejecuta en toPandas()
, se copia el marco de datos de la memoria distribuida (trabajador) a la memoria local (principal) y se pierde la mayor parte de las capacidades informáticas distribuidas. Entonces, un posible flujo de trabajo (que uso a menudo) podría ser preestablecer sus datos en un tamaño razonable usando métodos de cálculo distribuidos y luego convertirlos a un marco de datos Pandas para el conjunto de características enriquecido. Espero que ayude.
Soy un principiante de Spark-DataFrame API.
Uso este código para cargar csv tab-separated en Spark Dataframe
lines = sc.textFile(''tail5.csv'')
parts = lines.map(lambda l : l.strip().split(''/t''))
fnames = *some name list*
schemaData = StructType([StructField(fname, StringType(), True) for fname in fnames])
ddf = sqlContext.createDataFrame(parts,schemaData)
Supongamos que creo DataFrame con Spark a partir de archivos nuevos, y lo convierto a pandas usando el método incorporado para Pandas (),
- ¿Almacena el objeto Pandas en la memoria local?
- ¿El cómputo de bajo nivel de Pandas es manejado por Spark?
- ¿Expuso toda la funcionalidad del marco de datos de los pandas? (Supongo que sí)
- ¿Puedo convertirlo a Pandas y acabar de una vez, sin tocar la API de DataFrame?
Usar la chispa para leer en un archivo CSV para pandas
es un método bastante indirecto para lograr el objetivo final de leer un archivo CSV en la memoria.
Parece que podría estar malinterpretando los casos de uso de las tecnologías en juego aquí.
Spark es para computación distribuida (aunque se puede usar localmente). En general, es demasiado pesado para ser utilizado simplemente para leer en un archivo CSV.
En su ejemplo, el método sc.textFile
simplemente le dará una chispa RDD que efectivamente es una lista de líneas de texto. Esto probablemente no es lo que quieres. No se realizará ninguna inferencia de tipo, por lo que si desea sumar una columna de números en su archivo CSV, no podrá hacerlo porque todavía son cadenas en lo que se refiere a Spark.
Solo use pandas.read_csv
y lea todo el CSV en la memoria. Pandas deducirá automáticamente el tipo de cada columna. Spark no hace esto.
Ahora para responder tus preguntas:
Almacena el objeto Pandas en la memoria local
Sí. toPandas()
convertirá el Spark DataFrame en un Pandas DataFrame, que por supuesto está en la memoria.
¿La computación de bajo nivel de Pandas es manejada por Spark?
No. Pandas ejecuta sus propios cálculos, no hay interacción entre chispa y pandas, simplemente hay compatibilidad con API.
¿Expuso toda la funcionalidad del marco de datos de los pandas?
No. Por ejemplo, los objetos de la Series
tienen un método de interpolate
que no está disponible en los objetos de la Column
PySpark. Hay muchos métodos y funciones que están en la API de pandas que no están en la API de PySpark.
¿Puedo convertirlo a Pandas y acabar de una vez, sin tocar la API de DataFrame?
Absolutamente. De hecho, probablemente ni siquiera deberías usar Spark en este caso. pandas.read_csv
probablemente manejará su caso de uso a menos que esté trabajando con una gran cantidad de datos.
Intente resolver su problema con bibliotecas simples, de baja tecnología y fáciles de entender, y solo acceda a algo más complicado cuando lo necesite. Muchas veces, no necesitarás la tecnología más compleja.