Schema Operations
The iterable.ops.schema module provides functions for inferring schemas from data and converting them to various schema formats.
Overview
Schema operations help you understand and document data structure:
- Infer schemas from datasets automatically
- Convert to multiple formats (JSON Schema, Avro, Parquet, Cerberus, YAML)
- Detect constraints (min/max, length, enums)
- Validate data against schemas
Functions
infer()
Infer schema from an iterable dataset.
Detects field names, types, nullability, and optionally constraints.
from iterable.ops import schema
# Basic schema inference
sch = schema.infer("data.csv")
print(sch["fields"]["price"]["type"])
# With date detection and constraints
sch = schema.infer("data.csv", detect_dates=True, detect_constraints=True)
Parameters:
iterable: An iterable of row dictionaries, or a file path/streamdetect_dates: Whether to detect date and datetime fields (default: False)detect_constraints: Whether to detect constraints (min/max, length, etc.) (default: False)sample_size: Number of rows to sample for inference (default: 10000)
Returns: Dictionary containing:
fields: Dictionary mapping field names to metadata:type: Inferred type (string, integer, float, boolean, etc.)nullable: Whether field contains null valuessample_values: Sample values from the dataset
constraints: Dictionary of detected constraints (ifdetect_constraints=True):min,max: Minimum and maximum values (for numeric fields)min_length,max_length: String length constraintspossible_values: Enum-like value sets
to_jsonschema()
Convert inferred schema to JSON Schema format.
from iterable.ops import schema
sch = schema.infer("data.csv")
json_schema = schema.to_jsonschema(sch)
print(json.dumps(json_schema, indent=2))
Parameters:
schema: Schema dictionary frominfer()
Returns: JSON Schema document (compatible with JSON Schema validators)
to_yaml()
Convert inferred schema to YAML format.
from iterable.ops import schema
sch = schema.infer("data.csv")
yaml_str = schema.to_yaml(sch)
print(yaml_str)
Parameters:
schema: Schema dictionary frominfer()
Returns: YAML string (requires pyyaml for full support, falls back to JSON-like format)
to_cerberus()
Convert inferred schema to Cerberus validation schema format.
from iterable.ops import schema
from cerberus import Validator
sch = schema.infer("data.csv")
cerberus_schema = schema.to_cerberus(sch)
validator = Validator(cerberus_schema)
is_valid = validator.validate({"name": "John", "age": 30})
Parameters:
schema: Schema dictionary frominfer()
Returns: Cerberus-compatible schema dictionary
to_avro()
Convert inferred schema to Avro schema format.
from iterable.ops import schema
sch = schema.infer("data.csv")
avro_schema = schema.to_avro(sch, namespace="com.example")
print(json.dumps(avro_schema, indent=2))
Parameters:
schema: Schema dictionary frominfer()namespace: Avro namespace (default: "iterabledata")
Returns: Avro schema JSON
to_parquet_metadata()
Convert inferred schema to Parquet metadata format.
from iterable.ops import schema
sch = schema.infer("data.csv")
parquet_meta = schema.to_parquet_metadata(sch)
Parameters:
schema: Schema dictionary frominfer()
Returns: Parquet-compatible schema metadata dictionary
validate()
Validate data against an inferred or provided schema.
from iterable.ops import schema
sch = schema.infer("data.csv")
result = schema.validate("data.csv", sch)
print(f"Valid: {len(result['valid_rows'])}, Invalid: {len(result['invalid_rows'])}")
Parameters:
iterable: An iterable of row dictionaries, or a file path/streamschema: Schema dictionary frominfer()or manually createdstrict: If True, enforce strict type checking and flag extra/missing fields
Returns: Dictionary containing:
valid_rows: List of valid rowsinvalid_rows: List of (row, errors) tuplesstats: Validation statistics
Examples
Basic Schema Inference
from iterable.ops import schema
# Infer schema from file
sch = schema.infer("data.csv")
# Access field information
for field_name, field_info in sch["fields"].items():
print(f"{field_name}: {field_info['type']} (nullable: {field_info['nullable']})")
Schema with Constraints
from iterable.ops import schema
# Infer schema with constraints
sch = schema.infer("products.csv", detect_constraints=True)
# Check constraints
if "price" in sch.get("constraints", {}):
constraints = sch["constraints"]["price"]
print(f"Price range: ${constraints['min']} - ${constraints['max']}")
print(f"Possible values: {constraints.get('possible_values', 'N/A')}")
Generate JSON Schema
from iterable.ops import schema
import json
# Infer and convert to JSON Schema
sch = schema.infer("data.csv")
json_schema = schema.to_jsonschema(sch)
# Save to file
with open("schema.json", "w") as f:
json.dump(json_schema, f, indent=2)
# Use with JSON Schema validators
from jsonschema import validate as jsonschema_validate
jsonschema_validate({"name": "John", "age": 30}, json_schema)
Generate Avro Schema
from iterable.ops import schema
import json
# Infer and convert to Avro
sch = schema.infer("data.csv")
avro_schema = schema.to_avro(sch, namespace="com.example")
# Save to file
with open("schema.avsc", "w") as f:
json.dump(avro_schema, f, indent=2)
Generate Cerberus Schema
from iterable.ops import schema
from cerberus import Validator
# Infer and convert to Cerberus
sch = schema.infer("data.csv")
cerberus_schema = schema.to_cerberus(sch)
# Use with Cerberus validator
validator = Validator(cerberus_schema)
for row in data:
if validator.validate(row):
process(row)
else:
print(f"Validation errors: {validator.errors}")
Validate Against Schema
from iterable.ops import schema
# Infer schema
sch = schema.infer("data.csv")
# Validate new data against schema
result = schema.validate("new_data.csv", sch)
print(f"Validation results:")
print(f" Valid rows: {len(result['valid_rows'])}")
print(f" Invalid rows: {len(result['invalid_rows'])}")
# Process invalid rows
for row, errors in result["invalid_rows"]:
print(f" Row errors: {errors}")
Strict Schema Validation
from iterable.ops import schema
sch = schema.infer("data.csv")
# Strict validation flags extra/missing fields
result = schema.validate("data.csv", sch, strict=True)
for row, errors in result["invalid_rows"]:
if "Extra fields" in str(errors):
print(f"Row has extra fields: {row}")
Schema for Documentation
from iterable.ops import schema
# Generate schema documentation
sch = schema.infer("data.csv", detect_constraints=True)
print("Dataset Schema:")
print("=" * 50)
for field_name, field_info in sch["fields"].items():
print(f"\n{field_name}:")
print(f" Type: {field_info['type']}")
print(f" Nullable: {field_info['nullable']}")
if field_name in sch.get("constraints", {}):
constraints = sch["constraints"][field_name]
if "min" in constraints:
print(f" Range: {constraints['min']} - {constraints['max']}")
if "possible_values" in constraints:
print(f" Possible values: {constraints['possible_values']}")
Combining with Other Operations
from iterable.ops import schema, stats, inspect
# Analyze dataset structure
analysis = inspect.analyze("data.csv")
# Infer detailed schema
sch = schema.infer("data.csv", detect_constraints=True)
# Generate JSON Schema for API documentation
json_schema = schema.to_jsonschema(sch)
# Validate data quality
result = schema.validate("data.csv", sch)
print(f"Data quality: {result['stats']['valid']}/{result['stats']['total']} valid")
Schema Format Details
JSON Schema
JSON Schema is widely used for API validation and documentation:
{
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"properties": {
"name": {"type": "string"},
"age": {"type": "integer", "minimum": 0}
},
"required": ["name"]
}
Avro Schema
Avro schemas are used for data serialization:
{
"type": "record",
"name": "Record",
"namespace": "iterabledata",
"fields": [
{"name": "name", "type": "string"},
{"name": "age", "type": ["null", "long"], "default": null}
]
}
Cerberus Schema
Cerberus schemas are used for Python data validation:
{
"name": {"type": "string", "required": True},
"age": {"type": "integer", "min": 0}
}
Performance Notes
- Sampling: Schema inference uses sampling (default 10,000 rows) for performance
- Large datasets: Inference remains fast even on very large files
- Constraint detection: May be slower when
detect_constraints=Truedue to value analysis
Integration with Validation
Schemas can be used with the validation framework:
from iterable.ops import schema
from iterable import validate
# Infer schema
sch = schema.infer("data.csv")
# Validate against schema
result = schema.validate("data.csv", sch)
# Or use validation rules based on schema
rules = {}
for field_name, field_info in sch["fields"].items():
if not field_info.get("nullable", True):
rules[field_name] = ["required"]
validate_results = validate.iterable("data.csv", rules)