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


Soy un principiante de Spark-DataFrame API.

Uso este código para cargar csv separados por pestañas 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 toPandas (),

  • ¿Almacena el objeto Pandas en la memoria local?
  • ¿La computación de bajo nivel de Pandas es manejada por Spark?
  • ¿Expone todas las funcionalidades de pandas dataframe?(Supongo que sí)
  • Puedo convertirlo toPandas y acaba de hacerlo, sin tocar tanto DataFrame API?
Author: Phillip Cloud, 2015-03-24

2 answers

Usar spark para leer en un archivo CSV a 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). Generalmente es demasiado pesado para ser utilizado simplemente para leer en 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 sumar una columna de números en su archivo CSV, no podrá hacerlo porque siguen siendo cadenas en lo que respecta a Spark.

Simplemente use pandas.read_csv y lea todo el CSV en memoria. Los Pandas inferirán automáticamente el tipo de cada columna. Spark no hace esto.

Ahora para responder a sus preguntas:

¿Almacena el objeto Pandas a local memoria:

Sí. toPandas() convertirá el DataFrame de Spark en un DataFrame de Pandas, que por supuesto está en 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 spark y pandas, simplemente hay algo de compatibilidad con la API.

¿Expone toda la funcionalidad de pandas dataframe?

No. Por ejemplo, los objetos Series tienen un método interpolate que no es disponible en objetos PySpark Column. Hay muchos métodos y funciones que están en la API de pandas que no están en la API de PySpark.

¿Puedo convertir toPandas y simplemente terminar con él, sin tocar tanto DataFrame API?

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 enorme cantidad de datos.

Trate de resolver su problema con simple, bibliotecas de baja tecnología, fáciles de entender, y solo ir a algo más complicado como lo necesite. Muchas veces, no necesitará la tecnología más compleja.

 41
Author: Phillip Cloud,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-03-24 13:31:58

Usando algún contexto spark o método de contexto hive(sc.textFile(), hc.sql()) para leer datos' en memoria ' devuelve un RDD, pero el RDD permanece en la memoria distribuida (memoria en los nodos de trabajo), no en la memoria en 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 worker a la memoria del nodo maestro. Así se pierde su beneficios de cómputo distribuido (pero aún puede ejecutar los métodos rdd).

De manera similar con pandas, cuando ejecuta toPandas(), copia el marco de datos de la memoria distribuida (de trabajo) a la memoria local (maestra) y pierde la mayor parte de sus capacidades de computación distribuida. Por lo tanto, un posible flujo de trabajo (que uso a menudo) podría ser pre-munge sus datos en un tamaño razonable utilizando métodos de cálculo distribuidos y luego convertir a un marco de datos Pandas para el conjunto de características ricas. Espero que eso ayude.

 0
Author: TheProletariat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-05-29 16:37:44