data-classification
Data classification strategies, tagging frameworks, sensitivity levels, and automated classification patterns for Unity Catalog.
Installation
Follow the repository instructions for this skill and your agent. Review the files and dependencies before adding it to your workflow.
View source ↗GuidesSkill instructions
Data Classification Skill
Overview
Comprehensive data classification framework for identifying, tagging, and managing data based on sensitivity, regulatory requirements, and business context.
Classification Framework
Sensitivity Levels
- PUBLIC: Approved for public disclosure
- INTERNAL: Internal business use only
- CONFIDENTIAL: Sensitive business data
- RESTRICTED: Highly sensitive regulated data (PII, PHI, PCI)
Data Domains
- CUSTOMER: Customer and prospect data
- FINANCIAL: Financial and accounting data
- EMPLOYEE: HR and employee information
- PRODUCT: Product and service data
- OPERATIONAL: System and operational data
PII Categories
- DIRECT_IDENTIFIERS: Name, email, SSN, phone
- QUASI_IDENTIFIERS: Zip code, DOB, gender
- SENSITIVE_ATTRIBUTES: Health, race, religion, biometrics
- FINANCIAL_DATA: Credit cards, bank accounts, salary
Classification Methods
1. Schema-Based Classification
def classify_by_schema(column_name: str, data_type: str) -> dict:
"""Classify based on column name and type."""
classification = {"sensitivity": "INTERNAL"}
col_lower = column_name.lower()
if any(x in col_lower for x in ['ssn', 'social_security', 'tax_id']):
classification = {"sensitivity": "RESTRICTED", "pii": "DIRECT_IDENTIFIERS"}
elif any(x in col_lower for x in ['email', 'phone', 'address']):
classification = {"sensitivity": "CONFIDENTIAL", "pii": "DIRECT_IDENTIFIERS"}
elif any(x in col_lower for x in ['salary', 'credit_card', 'bank_account']):
classification = {"sensitivity": "RESTRICTED", "pii": "FINANCIAL_DATA"}
return classification
2. Content-Based Classification
def classify_by_content(table: str, column: str, sample_rate: float = 0.01):
"""Sample data content for classification."""
samples = spark.table(table).sample(sample_rate).select(column).limit(100)
pii_patterns = {
'SSN': r'\b\d{3}-?\d{2}-?\d{4}\b',
'EMAIL': r'\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b',
'CREDIT_CARD': r'\b\d{4}[-\s]?\d{4}[-\s]?\d{4}[-\s]?\d{4}\b',
'PHONE': r'\b\d{3}[-.]?\d{3}[-.]?\d{4}\b'
}
detected_pii = []
for row in samples.collect():
value = str(row[0])
for pii_type, pattern in pii_patterns.items():
if re.match(pattern, value):
detected_pii.append(pii_type)
return list(set(detected_pii))
3. Tag Application
-- Create classification tags
CREATE TAG governance.sensitivity;
CREATE TAG governance.data_domain;
CREATE TAG governance.pii_category;
-- Apply to catalog
ALTER CATALOG production
SET TAGS ('governance.data_domain' = 'CUSTOMER');
-- Apply to table
ALTER TABLE production.customers.profiles
SET TAGS (
'governance.sensitivity' = 'RESTRICTED',
'governance.pii_category' = 'DIRECT_IDENTIFIERS'
);
-- Apply to column
ALTER TABLE production.customers.profiles
ALTER COLUMN email SET TAGS ('governance.sensitivity' = 'CONFIDENTIAL');
Automated Classification
class DataClassifier:
def __init__(self):
self.classification_rules = self.load_rules()
def classify_catalog(self, catalog: str):
"""Auto-classify entire catalog."""
schemas = list_schemas(catalog)
for schema in schemas:
tables = list_tables(catalog, schema)
for table in tables:
self.classify_table(f"{catalog}.{schema}.{table}")
def classify_table(self, table_name: str):
"""Classify table and columns."""
table_info = get_table_info(table_name)
# Table-level classification
table_class = self.infer_table_classification(table_info)
self.apply_table_tags(table_name, table_class)
# Column-level classification
for column in table_info.columns:
column_class = self.classify_column(column)
self.apply_column_tags(table_name, column.name, column_class)
def classify_column(self, column) -> dict:
"""Classify individual column."""
# Schema-based
schema_class = classify_by_schema(column.name, column.type)
# Content-based (if high confidence not achieved)
if schema_class["sensitivity"] == "INTERNAL":
content_class = classify_by_content(table, column.name)
if content_class:
return content_class
return schema_class
Best Practices
- Start with High-Value Data: Classify PII and regulated data first
- Automate Where Possible: Use rules and ML for consistency
- Human Validation: Review automated classifications
- Document Rationale: Maintain classification decisions
- Regular Re-classification: Update when schemas change
- Align with Policies: Link classification to access/retention policies
Templates
- classification-rules.yaml: Classification rule definitions
- tag-taxonomy.sql: Tag schema and values
- classification-workflow.py: Automated classification pipeline
Examples
- pii-classification: PII detection and tagging
- sensitivity-assignment: Sensitivity level classification
- compliance-mapping: Map classifications to regulations
Examples
Read the usage examples in the source repository.
View source ↗Source history
- Indexed on
- 2026-01-20
- Index updated
- 2026-01-26
- Branch
- main
Index and sync dates describe this directory. View the source repository for code history.
GitHub ↗chat Comments (0)
Sign in to join the discussion and leave a comment.
No comments yet. Be the first to share your thoughts!