. Advertisement .
..3..
. Advertisement .
..4..
There are many situations where you may need to change your application to Pandas. This process may need a lot of data conversion. This guide will teach you how to convert PySpark DataFrame to Pandas and make it as painless as possible.
Convert PySpark DataFrame to Pandas
DataFrame.toPandas()
The method DataFrame.toPandas() from the pyspark.sql is what you need here. Available since version 1.3.0, it returns a Pandas DataFrame with the content of the given Spark DataFrame. This method has no parameter:
DataFrame.toPandas()
Note that this only works only when you have Pandas installed and accessible on your system. You should use this method when the resulting DataFrame is likely to be small since every data will be loaded into the memory of your Spark driver.
Example
As an example, we are going to create a Spark DataFrame with its Python API first. It contains information about several related websites.
import pyspark
from pyspark.sql import SparkSession
from pyspark.sql.types import StructType, StructField, StringType, IntegerType, FloatType
spark = SparkSession.builder.getOrCreate()
schema = StructType([
StructField("Site", StringType(), True),
StructField("Ranking", IntegerType(), True),
StructField("Type", StringType(), True),
StructField("Foundation", IntegerType(), True),
StructField("Top Language", StringType(), True)
])
data = [
("ITTutoria", 1, "Tutorials", 2022, "Python"),
("Stack Overflow", 2, "Q&A", 2008, "JavaScript"),
("Quora", 3, "Q&A", 2009, None),
("Reddit", 4, "Forum", 2005, None)
]
df_spark = spark.createDataFrame(data=data, schema=schema)
df_spark.show()
......... ADVERTISEMENT .........
..8..
To convert it to a Pandas DataFrame, you will need to import the pandas module and invoke the method toPandas():
import pandas as pd
df = df_spark.toPandas()
df
......... ADVERTISEMENT .........
..8..
You can print a summary of this newly created DataFrame with the method() info:
df.info()
......... ADVERTISEMENT .........
..8..
As you can see, the method toPandas() retains the original DataFrame’s schema and converts it to the correct index dtype and column names as well.
Conversion Optimization
Since the method DataFrame.toPandas() is only designed for dealing with small datasets, it has horrible performance when you need to load a lot of data. The conversion may run slowly or even bog down your system by consuming all the memory.
Apache Arrow can come in handy in those situations. It is a software framework written for processing in-memory columnar data. Spark can take advantage of it to transfer data between Python and JVM processes (which are your Spark and Pandas programs). As a result, it can remove common restraints when working with big data, such as the RAM size, volatility, and cost.
Keep in mind that Arrow doesn’t support converting every data type of Spark SQL. Most of them are, but not nested StructType, ArrayType of TimestampType, and MapType. With PyArrow, the conversion will create a DataFrame (instead of a Pandas Series) to represent StructType.
Python developers can integrate Arrow into their NumPy and Pandas workflow to gain those benefits. It is also available when converting a Pandas DataFrame into a PySpark DataFrame.
However, it isn’t an automatic process. You will need some customizations and configurations to ensure compatibility and take its full advantage.
Install PyArrow – its Python bindings – on your system:
pip install pyarrow
If you use Conda for package management:
conda install -c conda-forge pyarrow
You will need to set the configuration spark.sql.execution.arrow.enabled to true (which is false by default). When an error happens before your program gets to Spark’s computation, the conversion will fall back to the normal implementation, which doesn’t use Arrow for optimization.
spark.conf.set("spark.sql.execution.arrow.enabled", "true")
df = df_spark.toPandas()
This approach doesn’t change the final resulting DataFrame – it just makes the conversion more efficient. Still, using Arrow doesn’t mean Spark can magically process a big subset of data with ease. It still needs to put all the records of the original DataFrame in its drive program.
Conclusion
You can convert PySpark DataFrame to Pandas with the method toPandas(). It doesn’t require any argument, and when used with PyArrow, you can optimize the performance and usage of resources. Want to do a reverse conversion from Pandas to Spark? Give this guide a try.
Leave a comment