¿Qué está haciendo realmente el método `toPandas` de Spark DataFrame?

Soy un principiante de Spark-DataFrame API.

Utilizo este código para cargar csv separado por tabulación 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 nuevos archivos, y los convierto a pandas usando el método incorporado aPandas (),

  • ¿Almacena el objeto Pandas en la memoria local?
  • ¿El cómputo de bajo nivel de Pandas se maneja todo por Spark?
  • ¿Expone toda la funcionalidad del dataframe pandas? (Supongo que sí)
  • ¿Puedo convertirlo en Bandas y simplemente terminar con eso, sin tocar tanto la API de DataFrame?

Usar chispa para leer en un archivo CSV a pandas es un método bastante completo para lograr el objective 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). Por lo general, es demasiado pesado para usarlo simplemente para leer un archivo CSV.

En su ejemplo, el método sc.textFile simplemente le dará un RDD de chispa que es efectivamente 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 sumr una columna de números en su archivo CSV, no podrá hacerlo porque aún son cadenas en lo que respecta a Spark.

Simplemente use pandas.read_csv y lea todo el CSV en la memoria. Las pandas inferirán automáticamente el tipo de cada columna. La chispa no hace esto.

Ahora para responder a sus 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.

¿El cálculo de bajo nivel de Pandas se maneja todo por Spark?

No. Pandas ejecuta sus propios cálculos, no hay interacción entre spark y pandas, simplemente hay algo de compatibilidad API.

¿Expone toda la funcionalidad de dataframe 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 muchos métodos y funciones que están en la API de pandas que no están en la API de PySpark.

¿Puedo convertirlo en Bandas y simplemente terminar con eso, sin tocar tanto la API de DataFrame?

Absolutamente. De hecho, probablemente no 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 vaya a algo más complicado según lo necesite. Muchas veces, no necesitarás la tecnología más compleja.

Al utilizar algún método de contexto de sc.textFile() o de contexto de chispa ( sc.textFile() , hc.sql() ) para leer los datos ‘en la memoria’, se devuelve un RDD, pero el RDD permanece en la memoria distribuida (memoria en los nodos de trabajo), no en la memoria El nodo maestro. Todos los métodos RDD ( rdd.map() , rdd.reduceByKey() , etc.) están diseñados para ejecutarse en paralelo en los nodos de trabajo, con algunas excepciones. Por ejemplo, si ejecuta un método rdd.collect() , termina copiando el contenido del rdd de todos los nodos de trabajo a la memoria del nodo maestro. Por lo tanto, pierde sus beneficios de cálculo distribuido (pero aún puede ejecutar los métodos rdd).

De manera similar con pandas, cuando ejecuta en toPandas() , copia el dataframe de la memoria distribuida (trabajador) a la memoria local (maestra) y pierde la mayoría de sus capacidades de cálculo distribuido. Por lo tanto, un flujo de trabajo posible (que uso a menudo) podría ser la de remover sus datos en un tamaño razonable utilizando métodos de cálculo distribuidos y luego convertirlos en un dataframe Pandas para el rico conjunto de funciones. Espero que ayude.