Built with Tutify.io

    AIStudyLabs

    Explain PySpark inferSchema

    Explain PySpark inferSchema

    In PySpark, inferSchema is an option that automatically determines column data types when reading data from external sources such as CSV files. When you load CSV data into a PySpark DataFrame, Spark must assign a schema (data types for each column). If you don’t define the schema explicitly, all columns are treated as strings by default.

    To address this, PySpark offers the inferSchema option, which scans the dataset and infers the appropriate data types. This feature is particularly useful when working with CSV, JSON, or other semi-structured data formats, saving time and effort in manual schema definition.

    Manually specifying schemas can be tedious and error-prone, especially with large datasets. That’s why inferSchema is often used during exploration.

    In this guide, I’ll explore

    Key points-

    <a id="h-use-inferschema-with-csv"></a>

    Use inferSchema with CSV

    CSV is one of the most common formats for raw data, and by default, Spark treats all columns as strings. To infer actual types, you need to enable explicitly inferSchema.

    
    # Load CSV without inferSchema
    from pyspark.sql import SparkSession
    spark = SparkSession.builder.appName("InferSchemaCSV").getOrCreate()
    
    # Create sample CSV data
    data = ["1,John,25", "2,Sara,30", "3,David,35"]
    rdd = spark.sparkContext.parallelize(data)
    rdd.saveAsTextFile("C:/User/sample.csv")
    
    # Load CSV without inferSchema
    df = spark.read.csv(C:/User/sample.csv", header=True, inferSchema=False)
    df.printSchema()
    

    Yields below the output.

    By default, this option is set to False. When set to True, Spark automatically infers column data types from the dataset. Keep in mind that enabling this requires an additional pass over the data to determine the schema.

    
    # Read CSV with automatic schema inference
    df = spark.read.csv("path/to/file.csv", header=True, inferSchema=True)
    df.printSchema()
    

    Yields below the output.

    <a id="h-provide-custom-schema-when-inferschema-false"></a>

    Provide Custom Schema (When inferSchema=False)

    If you already know the structure of your dataset, you can define the schema manually instead of relying on automatic inference. This avoids the extra overhead of inferSchema=True and ensures that your columns have the correct data types.

    
    # Define Custom Schema
    from pyspark.sql import SparkSession
    from pyspark.sql.types import StructType, StructField, StringType, IntegerType
    
    # Create a Spark session
    spark = SparkSession.builder.appName("CustomSchemaExample").getOrCreate()
    
    # Define schema manually
    custom_schema = StructType([
        StructField("id", IntegerType(), True),
        StructField("name", StringType(), True),
        StructField("age", IntegerType(), True)
    ])
    
    # Read a CSV file with the specified schema
    df = spark.read.csv("C:/User/sample.csv", header=True, schema=custom_schema)
    
    # Print schema
    df.printSchema()
    
    # Show data
    df.show()
    

    Yields below the output.

    
    # Output:
    root
     |-- id: integer (nullable = true)
     |-- name: string (nullable = true)
     |-- age: integer (nullable = true)
    
    +---+-----+---+
    | id| name|age|
    +---+-----+---+
    |  1| John| 25|
    |  2| Sara| 30|
    |  3|David| 35|
    +---+-----+---+
    

    <a id="h-use-inferschema-with-json"></a>

    Use inferSchema with JSON

    JSON is a self-descriptive, semi-structured format, and Spark can automatically infer data types from JSON strings. When working with JSON files, schema inference is enabled by default—unlike CSV files, you don’t need to specify .option("inferSchema", "true"). By creating an RDD of JSON strings, you can use spark.read.json() to directly parse the data and infer its schema automatically.

    
    # Use inferSchema with JSON
    data = [
        '{"id": 1, "name": "John", "age": 25}',
        '{"id": 2, "name": "Sara", "age": 30}',
        '{"id": 3, "name": "David", "age": 35}'
    ]
    rdd = spark.sparkContext.parallelize(data)
    rdd.saveAsTextFile("C:/User/sample.json")
    
    # Load JSON (schema inferred automatically)
    df_json = spark.read.json("C:/User/sample.json")
    df_json.printSchema()
    

    Yields below the output.

    
    # Output:
    root
     |-- age: long (nullable = true)
     |-- id: long (nullable = true)
     |-- name: string (nullable = true)
    

    <a id="h-schema-inference-from-a-dictionary"></a>

    Schema Inference from a Dictionary

    When creating a DataFrame from Python dictionaries, Spark also infers the schema automatically.

    
    # Schema Inference from a Dictionary
    data = [
        {"id": 1, "name": "John", "age": 25},
        {"id": 2, "name": "Sara", "age": 30},
        {"id": 3, "name": "David", "age": 35}
    ]
    
    df_dict = spark.createDataFrame(data)
    df_dict.printSchema()
    

    Yields below output.

    
    # Output:
    root
     |-- age: long (nullable = true)
     |-- id: long (nullable = true)
     |-- name: string (nullable = true)
    

    <a id="h-use-inferschema-with-parquet"></a>

    Use inferSchema with Parquet

    Parquet is a columnar format that stores schema metadata inside the file itself. So when you load Parquet files, schema inference happens automatically, and you don’t need to specify inferSchema.

    
    # Save DataFrame as Parquet
    df_dict.write.mode("overwrite").parquet("C:/User/sample_paraquet")
    
    # Read Parquet file
    df_parquet = spark.read.parquet("C:/User/sample_paraquet)
    df_parquet.printSchema()
    

    Yields below output.

    
    # Output:
    root
     |-- age: long (nullable = true)
     |-- id: long (nullable = true)
     |-- name: string (nullable = true)
    

    <a id="h-schema-inference-from-pandas-dataframe"></a>

    Schema Inference from Pandas DataFrame

    If you already have a Pandas DataFrame, you can convert it to a PySpark DataFrame, and Spark will infer the schema automatically.

    
    # Schema Inference from Pandas DataFrame
    import pandas as pd
    
    # Create Pandas DataFrame
    pdf = pd.DataFrame({
        "id": [1, 2, 3],
        "name": ["John", "Sara", "David"],
        "age": [25, 30, 35]
    })
    
    # Convert Pandas → PySpark DataFrame
    df_pandas = spark.createDataFrame(pdf)
    df_pandas.printSchema()
    df_pandas.show()
    

    Yields below output.

    
    # Output:
    root
     |-- id: long (nullable = true)
     |-- name: string (nullable = true)
     |-- age: long (nullable = true)
    

    Conclusion

    In this article, I have explored that PySpark’s inferSchema makes it easy to assign correct data types without manually defining a schema. While this is convenient during exploration, it’s important to note a few things:

    Happy Learning!!

    <a id="h-related-articles"></a>

    Related Articles