# Ingest > **Universal data ingestion from files, web, feeds, streams, repos, emails, and databases.** --- ## 🎯 Overview The **Ingest Module** is the entry point for loading data into Semantica. It provides universal data ingestion from files, web content, feeds, streams, repositories, emails, databases, and more. ### What is Data Ingestion? **Data ingestion** is the process of loading data from various sources into Semantica for processing. The ingest module handles: - **File Systems**: Local files, cloud storage (S3, GCS, Azure) - **Analytics Files**: Apache Parquet files and partitioned datasets - **Web Content**: Websites, RSS feeds, APIs - **Streams**: Real-time data from Kafka, RabbitMQ, etc. - **Databases**: SQL, NoSQL, and cloud data warehouses including Snowflake - **Repositories**: Git repositories (GitHub, GitLab) - **Email**: IMAP, POP3 servers - **MCP**: Model Context Protocol servers ### Why Use the Ingest Module? - **Universal Support**: Handle multiple data formats and sources - **Automatic Detection**: Automatically detect file types and content - **Streaming Support**: Process real-time data streams - **Cloud Integration**: Direct support for cloud storage - **Rate Limiting**: Built-in rate limiting for web crawling - **Error Handling**: Robust error handling and retry logic ### How It Works 1. **Source Detection**: Automatically detect the type of data source 2. **Connection**: Establish connection to the source (file system, web, database, etc.) 3. **Loading**: Load data from the source 4. **Format Detection**: Detect the format of the loaded data 5. **Output**: Return data in a standardized format for processing
- :material-file-document-multiple:{ .lg .middle } **File Ingestion** --- Local and Cloud (S3/GCS/Azure) file processing with type detection - :material-web:{ .lg .middle } **Web Crawling** --- Scrape websites with rate limiting, robots.txt compliance, and JS rendering - :material-rss:{ .lg .middle } **Feed Monitoring** --- Consume RSS/Atom feeds with real-time update monitoring - :material-broadcast:{ .lg .middle } **Stream Processing** --- Ingest from Kafka, RabbitMQ, Kinesis, and Pulsar - :material-source-branch:{ .lg .middle } **Code Repos** --- Clone and analyze Git repositories (GitHub/GitLab) - :material-database:{ .lg .middle } **Databases** --- Ingest tables and query results from SQL, NoSQL, and cloud data warehouses including Snowflake - :material-table:{ .lg .middle } **Parquet Datasets** --- Read Parquet files, schemas, metadata, and Hive-style partitioned directories
!!! tip "When to Use" - **Data Onboarding**: The entry point for all external data into Semantica - **Crawling**: Building a dataset from the web - **Monitoring**: Listening to real-time data streams - **Migration**: Importing legacy data from databases --- ## ⚙️ Algorithms Used ### File Processing - **Magic Number Detection**: Identifying file types by binary signatures, not just extensions. - **Recursive Traversal**: Efficiently walking directory trees. ### Web Ingestion - **Sitemap Parsing**: Discovering URLs via XML sitemaps. - **DOM Extraction**: Removing boilerplate (nav/ads) to extract main content. - **Politeness**: Respecting `robots.txt` and enforcing crawl delays. ### Stream Processing - **Consumer Groups**: Managing offsets and scaling consumption (Kafka). - **Backpressure**: Handling high-velocity streams without crashing. ### Repository Analysis - **AST Parsing**: Extracting code structure (classes/functions) without executing. - **Dependency Parsing**: Reading `requirements.txt`, `package.json`, etc. --- ## Main Classes ### FileIngestor Handles file systems and object storage. **Methods:** | Method | Description | |--------|-------------| | `ingest_file(path)` | Process single file | | `ingest_directory(path)` | Process folder | ### ParquetIngestor Handles Apache Parquet files and partitioned datasets. **Methods:** | Method | Description | |--------|-------------| | `ingest_file(path, columns=None, limit=None)` | Read a Parquet file | | `ingest_directory(path, columns=None, limit=None)` | Read a partitioned Parquet directory | | `extract_schema(path)` | Extract column names, types, nullability, and schema metadata | | `extract_metadata(path)` | Extract row counts, row groups, compression, and partition info | ### WebIngestor Handles web content. **Methods:** | Method | Description | |--------|-------------| | `ingest_url(url)` | Scrape page | | `crawl(url, depth)` | Recursive crawl | ### StreamIngestor Handles real-time data. **Methods:** | Method | Description | |--------|-------------| | `consume(topic)` | Start consumption | ### RepoIngestor Handles code repositories. **Methods:** | Method | Description | |--------|-------------| | `ingest_repo(url)` | Clone and process | ### FeedIngestor Handles RSS and Atom feeds. **Methods:** | Method | Description | |--------|-------------| | `ingest_feed(url)` | Parse feed items | | `monitor(url)` | Watch for updates | ### EmailIngestor Handles IMAP and POP3 servers. **Methods:** | Method | Description | |--------|-------------| | `connect_imap(host)` | Connect to server | | `ingest_mailbox(name)` | Fetch emails | ### DBIngestor Handles SQL and NoSQL databases including Snowflake. **Methods:** | Method | Description | |--------|-------------| | `ingest_database(conn)` | Export tables | | `execute_query(sql)` | Run custom SQL | | `connect_snowflake(account, user, password, warehouse)` | Connect to Snowflake | | `ingest_snowflake_table(table_name)` | Ingest Snowflake table | | `execute_snowflake_query(sql)` | Run Snowflake SQL | **Supported Databases:** - **PostgreSQL**, **MySQL**, **SQLite** - **Microsoft SQL Server**, **Oracle** - **Snowflake** (Cloud Data Warehouse) - **MongoDB**, **Cassandra** (NoSQL) - **BigQuery**, **Redshift** (Cloud Data Warehouses) ### MCPIngestor Handles Model Context Protocol servers. **Methods:** | Method | Description | |--------|-------------| | `connect(url)` | Connect to server | | `ingest_resources()` | Fetch resources | | `call_tool(name)` | Execute tool | --- ## Convenience Functions ```python from semantica.ingest import ingest # Auto-detect source type ingest("doc.pdf", source_type="file") ingest("events.parquet") # Auto-detects Parquet ingest("https://google.com", source_type="web") ingest("kafka://topic", source_type="stream") ``` ### Parquet Dataset Ingestion ```python from semantica.ingest import ParquetIngestor, ingest_parquet ingestor = ParquetIngestor() # Read selected columns from a local Parquet file events = ingestor.ingest_file( "events.parquet", columns=["event_id", "event_type"], limit=1000, ) # Inspect schema and metadata without reading rows schema = ingestor.extract_schema("events.parquet") metadata = ingestor.extract_metadata("events.parquet") # Read a Hive-style partitioned directory such as country=US/year=2026/ partitioned = ingest_parquet("./warehouse/events", method="directory") ``` --- ## Configuration ### Environment Variables ```bash export INGEST_USER_AGENT="SemanticaBot/1.0" export AWS_ACCESS_KEY_ID=... export KAFKA_BOOTSTRAP_SERVERS=localhost:9092 ``` ### YAML Configuration ```yaml ingest: web: user_agent: "MyBot" rate_limit: 1.0 # seconds files: max_size: 100MB allowed_extensions: [.pdf, .txt, .md] ``` --- ## Integration Examples ### Continuous Feed Ingestion ```python from semantica.ingest import FeedIngestor from semantica.pipeline import Pipeline # 1. Setup Monitor ingestor = FeedIngestor() pipeline = Pipeline() def on_new_item(item): # 2. Trigger Pipeline on new content pipeline.run(item.content) # 3. Start Monitoring ingestor.monitor( "https://news.ycombinator.com/rss", callback=on_new_item, interval=300 ) ``` ### Snowflake Data Warehouse Integration ```python from semantica.ingest import DBIngestor # 1. Connect to Snowflake ingestor = DBIngestor() ingestor.connect_snowflake( account="your_account.snowflakecomputing.com", user="your_username", password="your_password", warehouse="ANALYTICS_WH", database="PRODUCTION_DB", schema="PUBLIC" ) # 2. Ingest entire table data = ingestor.ingest_snowflake_table("CUSTOMERS") # 3. Or run custom query results = ingestor.execute_snowflake_query(""" SELECT CUSTOMER_ID, NAME, EMAIL, CREATED_AT FROM CUSTOMERS WHERE CREATED_AT > '2024-01-01' """) # 4. Process with pipeline for row in results: pipeline.process(row) ``` !!! info "Comprehensive Snowflake Guide" For detailed Snowflake integration including authentication methods, advanced features, and best practices, see the **[Snowflake Integration Guide](../integrations/snowflake.md)**. ### Multi-Database Integration ```python from semantica.ingest import DBIngestor ingestor = DBIngestor() # Connect to multiple databases connections = { "snowflake": ingestor.connect_snowflake(...), "postgres": ingestor.connect_database("postgresql://..."), "mysql": ingestor.connect_database("mysql://...") } # Ingest from all sources for name, conn in connections.items(): data = ingestor.ingest_database(conn) print(f"Ingested {len(data)} records from {name}") ``` --- ## Best Practices 1. **Respect Rate Limits**: When crawling, always set a polite `rate_limit` to avoid getting banned. 2. **Filter Content**: Use `allowed_extensions` or URL patterns to avoid ingesting junk data. 3. **Handle Failures**: Stream ingestors should have error handlers for bad messages. 4. **Use Credentials Securely**: Never hardcode API keys; use Environment Variables. --- ## See Also - **[Snowflake Integration Guide](../integrations/snowflake.md)** - Comprehensive Snowflake integration with authentication, advanced features, and best practices - [Parse Module](parse.md) - Processes the raw data ingested here - [Split Module](split.md) - Chunks the ingested content - [Utils Module](utils.md) - Validation helpers ## Cookbook Interactive tutorials to learn data ingestion: - **[Data Ingestion](https://github.com/Hawksight-AI/semantica/blob/main/cookbook/introduction/02_Data_Ingestion.ipynb)**: Comprehensive guide to data ingestion from multiple sources - **Topics**: File ingestion, web scraping, database integration, streams, feeds, repositories, email, MCP - **Difficulty**: Beginner - **Use Cases**: Loading data from various sources, understanding ingestion capabilities - **[Multi-Source Data Integration](https://github.com/Hawksight-AI/semantica/blob/main/cookbook/advanced/06_Multi_Source_Data_Integration.ipynb)**: Merge data from disparate sources into a unified graph - **Topics**: Entity resolution, merging, fusion, multi-source integration - **Difficulty**: Advanced - **Use Cases**: Combining data from multiple sources, data fusion