100% found this document useful (2 votes)
2K views

Immediate download Data Ingestion with Python Cookbook: A practical guide to ingesting, monitoring, and identifying errors in the data ingestion process 1st Edition Esppenchutz ebooks 2024

practical

Uploaded by

lynardnauto
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
100% found this document useful (2 votes)
2K views

Immediate download Data Ingestion with Python Cookbook: A practical guide to ingesting, monitoring, and identifying errors in the data ingestion process 1st Edition Esppenchutz ebooks 2024

practical

Uploaded by

lynardnauto
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 66

Download Full Version ebookmass - Visit ebookmass.

com

Data Ingestion with Python Cookbook: A practical


guide to ingesting, monitoring, and identifying
errors in the data ingestion process 1st Edition
Esppenchutz
https://ebookmass.com/product/data-ingestion-with-python-
cookbook-a-practical-guide-to-ingesting-monitoring-and-
identifying-errors-in-the-data-ingestion-process-1st-
edition-esppenchutz/

OR CLICK HERE

DOWLOAD NOW

Discover More Ebook - Explore Now at ebookmass.com


Instant digital products (PDF, ePub, MOBI) ready for you
Download now and discover formats that fit your needs...

Python Data Cleaning Cookbook - Second Edition Michael


Walker

https://ebookmass.com/product/python-data-cleaning-cookbook-second-
edition-michael-walker/

ebookmass.com

Data Engineering with dbt: A practical guide to building a


cloud-based, pragmatic, and dependable data platform with
SQL Zagni
https://ebookmass.com/product/data-engineering-with-dbt-a-practical-
guide-to-building-a-cloud-based-pragmatic-and-dependable-data-
platform-with-sql-zagni/
ebookmass.com

Exploratory Data Analysis with Python Cookbook: Over 50


recipes to analyze, visualize, and extract insights from
structured and unstructured data Oluleye
https://ebookmass.com/product/exploratory-data-analysis-with-python-
cookbook-over-50-recipes-to-analyze-visualize-and-extract-insights-
from-structured-and-unstructured-data-oluleye/
ebookmass.com

Study Guide for Pathophysiology: The Biological Basis


Disease in Adults and – Ebook PDF Version

https://ebookmass.com/product/study-guide-for-pathophysiology-the-
biological-basis-disease-in-adults-and-ebook-pdf-version/

ebookmass.com
Cherished by the Agent (In Clear Sight Book 2) Kennedy L.
Mitchell

https://ebookmass.com/product/cherished-by-the-agent-in-clear-sight-
book-2-kennedy-l-mitchell/

ebookmass.com

Unthinkable Anna Hill

https://ebookmass.com/product/unthinkable-anna-hill/

ebookmass.com

Energy Systems and Sustainability Third Edition Bob


Everett

https://ebookmass.com/product/energy-systems-and-sustainability-third-
edition-bob-everett/

ebookmass.com

Evolution of a Taboo: Pigs and People in the Ancient Near


East Max D Price

https://ebookmass.com/product/evolution-of-a-taboo-pigs-and-people-in-
the-ancient-near-east-max-d-price/

ebookmass.com

Dad Jokes for Kids: 350+ Silly, Laugh-Out-Loud Jokes for


the Whole Family! Jimmy Niro

https://ebookmass.com/product/dad-jokes-for-kids-350-silly-laugh-out-
loud-jokes-for-the-whole-family-jimmy-niro/

ebookmass.com
Zoology 12th Edition Stephen A. Miller

https://ebookmass.com/product/zoology-12th-edition-stephen-a-miller/

ebookmass.com
Data Ingestion with Python
Cookbook

A practical guide to ingesting, monitoring, and identifying


errors in the data ingestion process

Gláucia Esppenchutz

BIRMINGHAM—MUMBAI
Data Ingestion with Python Cookbook
Copyright © 2023 Packt Publishing
All rights reserved. No part of this book may be reproduced, stored in a retrieval system, or transmitted
in any form or by any means, without the prior written permission of the publisher, except in the case
of brief quotations embedded in critical articles or reviews.
Every effort has been made in the preparation of this book to ensure the accuracy of the information
presented. However, the information contained in this book is sold without warranty, either express
or implied. Neither the author, nor Packt Publishing or its dealers and distributors, will be held liable
for any damages caused or alleged to have been caused directly or indirectly by this book.
Packt Publishing has endeavored to provide trademark information about all of the companies and
products mentioned in this book by the appropriate use of capitals. However, Packt Publishing cannot
guarantee the accuracy of this information.

Group Product Manager: Reshma Raman


Publishing Product Manager: Arindam Majumdar
Senior Editor: Tiksha Lad
Technical Editor: Devanshi Ayare
Copy Editor: Safis Editing
Project Coordinator: Farheen Fathima
Proofreader: Safis Editing
Indexer: Sejal Dsilva
Production Designer: Jyoti Chauhan
Marketing Coordinator: Nivedita Singh

First published: May 2023

Production reference: 1300523

Published by Packt Publishing Ltd.


Livery Place
35 Livery Street
Birmingham
B3 2PB, UK.

ISBN 978-1-83763-260-2

www.packtpub.com
This book represents a lot and wouldn’t be possible without my loving husband, Lincoln, and his
support and understanding during this challenging endeavor. I want to thank all my friends that
didn’t let me give up and always boosted my spirits, along with my grandmother, who always believed,
helped, and said I would do big things one day. Finally, I want to thank my beloved and four-pawed
best friend, who is at peace, Minduim, for “helping” me to write this book.

– Gláucia Esppenchutz
Contributors

About the author


Gláucia Esppenchutz is a data engineer with expertise in managing data pipelines and vast amounts
of data using cloud and on-premises technologies. She worked in companies such as Globo.com,
BMW Group, and Cloudera. Currently, she works at AiFi, specializing in the field of data operations
for autonomous systems.
She comes from the biomedical field and shifted her career ten years ago to chase the dream of
working closely with technology and data. She is in constant contact with the open source community,
mentoring people and helping to manage projects, and has collaborated with the Apache, PyLadies
group, FreeCodeCamp, Udacity, and MentorColor communities.

I want to thank my patient and beloved husband and my friends. Thanks also to my mentors in the
Python open source community and the DataBootCamp founders, who guided me at the beginning
of my journey.
Thanks to the Packt team, who helped me through some hard times; you were terrific!
About the reviewers
Bitthal Khaitan is currently working as a big data and cloud engineer with CVS Health, a Fortune
4 organization. He has a demonstrated history of working in the cloud, data and analytics industry
for 12+ years. His primary certified skills are Google Cloud Platform (GCP), the big data ecosystem
(Hadoop, Spark, etc.), and data warehousing on Teradata. He has worked in all phases of the SDLC
of DW/BI and big data projects with strong expertise in the USA healthcare, insurance and retail
domains. He actively helps new graduates with mentoring, resume reviews, and job hunting tips in
the data engineering domain. Over 20,000 people follow Bitthal on LinkedIn. He is currently based
out of Dallas, Texas, USA.
Jagjeet Makhija is a highly accomplished technology leader with over 20 years of experience. They are
skilled not only in various domains including AI, data warehouse architecture, and business analytics,
but also have a strong passion for staying ahead of technology trends such as AI and ChatGPT.
Jagjeet is recognized for their significant contributions to the industry, particularly in complex proof
of concepts and integrating Microsoft products with ChatGPT. They are also an avid book reviewer
and have actively shared their extensive knowledge and expertise through presentations, blog articles,
and online forums.
Krishnan Raghavan is an IT professional with over 20 years of experience in the area of software
development and delivery excellence across multiple domains and technology, ranging from C++ to
Java, Python, data warehousing, and big data tools and technologies. Krishnan tries to give back to the
community by being part of GDG – Pune Volunteer Group, helping the team in organizing events.
When not working, Krishnan likes to spend time with his wife and daughter, as well as reading fiction,
non-fiction, and technical books. Currently, he is unsuccessfully trying to learn how to play the guitar.
You can connect with Krishnan at mail to: k r i s h n a n @ g m a i l . c o m or via
LinkedIn: www.linkedin.com/in/krishnan-raghavan

I would like to thank my wife, Anita, and daughter, Ananya, for giving me the time and space to
review this book.
Table of Contents

Prefacexv

Part 1: Fundamentals of Data Ingestion


1
Introduction to Data Ingestion 3
Technical requirements 4 How to do it… 17
Setting up Python and its environment 4 How it works… 21
See also 22
Getting ready 4
How to do it… 5 Creating schemas 22
How it works… 7 Getting ready 22
There’s more… 7 How to do it… 22
See also 7 How it works… 24
Installing PySpark 8 See also 25

Getting ready 8 Applying data governance in ingestion 25


How to do it… 10 Getting ready 25
How it works… 12 How to do it… 26
There’s more… 12 How it works… 28
See also 12 See also 28
Configuring Docker for MongoDB 13 Implementing data replication 29
Getting ready 13 Getting ready 29
How to do it… 13 How to do it… 29
How it works… 14 How it works… 29
There’s more… 16 There’s more… 30
See also 16
Further reading 30
Configuring Docker for Airflow 16
Getting ready 17
viii Table of Contents

2
Principals of Data Access – Accessing Your Data 31
Technical requirements 31 How to do it… 47
Implementing governance in a data How it works… 48
access workflow 32 There’s more… 49
Getting ready 32 See also 52
How to do it… 33 Managing encrypted files 52
How it works… 34 Getting ready 52
See also 34 How to do it… 53
Accessing databases and data How it works… 54
warehouses34 There’s more… 55
Getting ready 35 See also 56
How to do it… 35 Accessing data from AWS using S3 56
How it works… 37 Getting ready 56
There’s more… 38 How to do it… 59
See also 39 How it works… 62
Accessing SSH File Transfer Protocol There’s more… 63
(SFTP) files 39 See also 63
Getting ready 39 Accessing data from GCP using
How to do it… 41 Cloud Storage 64
How it works… 43 Getting ready 64
There’s more… 43 How to do it… 66
See also 44 How it works… 68
Retrieving data using API There’s more… 70
authentication44 Further reading 70
Getting ready 45

3
Data Discovery – Understanding Our Data before Ingesting It 71
Technical requirements 71 How to do it… 73
Documenting the data discovery How it works… 77
process71 Configuring OpenMetadata 77
Getting ready 72 Getting ready 77
Table of Contents ix

How to do it… 79 Getting ready 86


How it works… 84 How to do it… 88
There’s more… 86 How it works… 92
See also 86
Further reading 93
Connecting OpenMetadata Other tools 94
to our database 86

4
Reading CSV and JSON Files and Solving Problems 95
Technical requirements 95 How it works… 105
Reading a CSV file 96 There’s more… 106
See also 107
Getting ready 96
How to do it… 96 Using PySpark to read CSV files 108
How it works… 98 Getting ready 108
There’s more… 98 How to do it… 108
See also 99 How it works… 109
Reading a JSON file 99 There’s more… 110
See also 114
Getting ready 100
How to do it… 100 Using PySpark to read JSON files 114
How it works… 100 Getting ready 114
There’s more… 101 How to do it… 115
See also 103 How it works… 116
Creating a SparkSession for PySpark 103 There’s more… 117
See also 117
Getting ready 103
How to do it… 104 Further reading 117

5
Ingesting Data from Structured and Unstructured Databases 119
Technical requirements 119 There’s more… 127
Configuring a JDBC connection 120 See also 129

Getting ready 120 Ingesting data from a JDBC database


How to do it… 124 using SQL 129
How it works… 126 Getting ready 129
x Table of Contents

How to do it… 130 Getting ready 146


How it works… 132 How to do it… 146
There’s more… 133 How it works… 148
See also 133 There’s more… 149
See also 150
Connecting to a NoSQL
database (MongoDB) 134 Ingesting data from MongoDB
Getting ready 134 using PySpark 150
How to do it… 136 Getting ready 150
How it works… 142 How to do it… 151
There’s more… 144 How it works… 153
See also 145 There’s more… 155
See also 156
Creating our NoSQL table in
MongoDB145 Further reading 157

6
Using PySpark with Defined and Non-Defined Schemas 159
Technical requirements 159 How to do it… 169
Applying schemas to data ingestion 160 How it works… 170

Getting ready 160 Ingesting unstructured data with a


How to do it… 162 well-defined schema and format 172
How it works… 163 Getting ready 172
There’s more… 165 How to do it… 172
See also 165 How it works… 174
Importing structured data using a There’s more… 176
well-defined schema 165 See also 176

Getting ready 165 Inserting formatted SparkSession


How to do it… 165 logs to facilitate your work 176
How it works… 167 Getting ready 176
There’s more… 168 How to do it… 176
See also 169 How it works… 178
Importing unstructured data without There’s more… 179
a schema 169 See also 179

Getting ready… 169 Further reading 179


Table of Contents xi

7
Ingesting Analytical Data 181
Technical requirements 181 How it works… 197
Ingesting Parquet files 182 There’s more… 198
See also 200
Getting ready 182
How to do it… 183 Ingesting partitioned data 200
How it works… 184 Getting ready 200
There’s more… 185 How to do it… 201
See also 185 How it works… 201
Ingesting Avro files 185 There’s more… 203
See also 204
Getting ready 186
How to do it… 186 Applying reverse ETL 204
How it works… 188 Getting ready 204
There’s more… 190 How to do it… 205
See also 190 How it works… 206
Applying schemas to analytical data 191 There’s more… 207
See also 207
Getting ready 191
How to do it… 191 Selecting analytical data for reverse
How it works… 194 ETL207
There’s more… 194 Getting ready 207
See also 195 How to do it… 208
Filtering data and handling common How it works… 209
issues195 See also 210

Getting ready 195 Further reading 210


How to do it… 196

Part 2: Structuring the Ingestion Pipeline


8
Designing Monitored Data Workflows 213
Technical requirements 213 Getting ready 214
Inserting logs 214 How to do it… 214
How it works… 216
xii Table of Contents

See also 217 How it works… 229


There’s more… 229
Using log-level types 217
See also 230
Getting ready 217
How to do it… 217 Logging based on data 231
How it works… 219 Getting ready 231
There’s more… 220 How to do it… 231
See also 221 How it works… 232
There’s more… 233
Creating standardized logs 221
See also 233
Getting ready 222
How to do it… 222 Retrieving SparkSession metrics 234
How it works… 224 Getting ready 234
There’s more… 227 How to do it… 234
See also 227 How it works… 237
There’s more… 241
Monitoring our data ingest file size 227
See also 242
Getting ready 228
How to do it… 228 Further reading 242

9
Putting Everything Together with Airflow 243
Technical requirements 244 How to do it… 257
Installing Airflow 244 How it works… 260
There's more… 262
Configuring Airflow 244 See also 262
Getting ready 244
How to do it… 245 Configuring sensors 262
How it works… 247 Getting ready 262
See also 248 How to do it… 263
How it works… 264
Creating DAGs 248 See also 265
Getting ready 248
How to do it… 249 Creating connectors in Airflow 265
How it works… 253 Getting ready 266
There's more… 254 How to do it… 266
See also 255 How it works… 269
There's more… 270
Creating custom operators 255 See also 270
Getting ready 255
Table of Contents xiii

Creating parallel ingest tasks 270 Getting ready 274


Getting ready 270 How to do it… 275
How to do it… 271 How it works… 277
How it works… 272 There's more… 278
There's more… 273 See also 279
See also 274
Further reading 279
Defining ingest-dependent DAGs 274

10
Logging and Monitoring Your Data Ingest in Airflow 281
Technical requirements 281 Designing advanced monitoring 304
Installing and running Airflow 282 Getting ready 304
How to do it… 306
Creating basic logs in Airflow 283
How it works… 308
Getting ready 284
There’s more… 309
How to do it… 284
See also 309
How it works… 287
See also 289 Using notification operators 309
Getting ready 310
Storing log files in a remote location 289
How to do it… 312
Getting ready 289
How it works… 315
How to do it… 290
There’s more… 318
How it works… 298
See also 299 Using SQL operators for data quality 318
Getting ready 318
Configuring logs in airflow.cfg 299
How to do it… 320
Getting ready 299
How it works… 321
How to do it… 299
There’s more… 323
How it works… 301
See also 323
There’s more… 303
See also 304 Further reading 324

11
Automating Your Data Ingestion Pipelines 325
Technical requirements 325 Scheduling daily ingestions 326
Installing and running Airflow 326 Getting ready 327
xiv Table of Contents

How to do it… 327 There's more… 340


How it works… 330
Setting up the schedule_interval
There's more… 330
parameter340
See also 331
Getting ready 340
Scheduling historical data ingestion 331 How to do it… 341
Getting ready 331 How it works… 342
How to do it… 332 See also 342
How it works… 335
Solving scheduling errors 343
There's more… 336
Getting ready 343
Scheduling data replication 337 How to do it… 343
Getting ready 337 How it works… 346
How to do it… 338 There’s more… 347
How it works… 339
Further reading 347

12
Using Data Observability for Debugging, Error Handling,
and Preventing Downtime 349
Technical requirements 349 Getting ready 358
Docker images 350 How to do it… 358
How it works… 361
Setting up StatsD for monitoring 351 There’s more… 363
Getting ready 351
How to do it… 351 Creating an observability dashboard 363
How it works… 353 Getting ready 363
See also 354 How to do it… 363
How it works… 369
Setting up Prometheus for storing There’s more… 370
metrics354
Getting ready 354 Setting custom alerts or notifications 370
How to do it… 354 Getting ready 371
How it works… 356 How to do it… 371
There’s more… 357 How it works… 377

Setting up Grafana for monitoring 358 Further reading 378

Index379

Other Books You May Enjoy 388


Preface
Welcome to Data Ingestion with Python Cookbook. I hope you are excited as me to enter the world
of data engineering.
Data Ingestion with Python Cookbook is a practical guide that will empower you to design and implement
efficient data ingestion pipelines. With real-world examples and renowned open-source tools, this
book addresses your queries and hurdles head-on.
Beginning with designing pipelines, you’ll explore working with and without data schemas, constructing
monitored workflows using Airflow, and embracing data observability principles while adhering
to best practices. Tackling the challenges of reading diverse data sources and formats, you’ll gain a
comprehensive understanding of all these.
Our journey continues with essential insights into error logging, identification, resolution, data
orchestration, and effective monitoring. You’ll discover optimal approaches for storing logs, ensuring
easy access and references for them in the future.
By the end of this book, you’ll possess a fully automated setup to initiate data ingestion and pipeline
monitoring. This streamlined process will seamlessly integrate into the subsequent stages of the Extract,
Transform, and Load (ETL) process, propelling your data integration capabilities to new heights. Get
ready to embark on an enlightening and transformative data ingestion journey.

Who this book is for


This comprehensive book is specifically designed for Data Engineers, Data Integration Specialists, and
passionate data enthusiasts seeking a deeper understanding of data ingestion processes, data flows,
and the typical challenges encountered along the way. It provides valuable insights, best practices, and
practical knowledge to enhance your skills and proficiency in handling data ingestion tasks effectively.
Whether you are a beginner in the data world or an experienced developer, this book will suit you.
It is recommended to know the Python programming fundamentals and have basic knowledge of
Docker to read and run this book’s code.

What this book covers


Chapter 1, Introduction to Data Ingestion, introduces you to data ingestion best practices and the
challenges of working with diverse data sources. It explains the importance of the tools covered in
the book, presents them, and provides installation instructions.
xvi Preface

Chapter 2, Data Access Principals – Accessing your Data, explores data access concepts related to data
governance, covering workflows and management of familiar sources such as SFTP servers, APIs,
and cloud providers. It also provides examples of creating data access policies in databases, data
warehouses, and the cloud.
Chapter 3, Data Discovery – Understanding Our Data Before Ingesting It, teaches you the significance of
carrying out the data discovery process before data ingestion. It covers manual discovery, documentation,
and using an open-source tool, OpenMetadata, for local configuration.
Chapter 4, Reading CSV and JSON Files and Solving Problems, introduces you to ingesting CSV and JSON
files using Python and PySpark. It demonstrates handling varying data volumes and infrastructures
while addressing common challenges and providing solutions.
Chapter 5, Ingesting Data from Structured and Unstructured Databases, covers fundamental concepts
of relational and non-relational databases, including everyday use cases. You will learn how to read
and handle data from these models, understand vital considerations, and troubleshoot potential errors.
Chapter 6, Using PySpark with Defined and Non-Defined Schemas, delves deeper into common PySpark
use cases, focusing on handling defined and non-defined schemas. It also explores reading and
understanding complex logs from Spark (PySpark core) and formatting techniques for easier debugging.
Chapter 7, Ingesting Analytical Data, introduces you to analytical data and common formats for reading
and writing. It explores reading partitioned data for improved performance and discusses Reverse
ETL theory with real-life application workflows and diagrams.
Chapter 8, Designing Monitored Data Workflows, covers logging best practices for data ingestion,
facilitating error identification, and debugging. Techniques such as monitoring file size, row count,
and object count enable improved monitoring of dashboards, alerts, and insights.
Chapter 9, Putting Everything Together with Airflow, consolidates the previously presented information
and guides you in building a real-life data ingestion application using Airflow. It covers essential
components, configuration, and issue resolution in the process.
Chapter 10, Logging and Monitoring Your Data Ingest in Airflow, explores advanced logging and
monitoring in data ingestion with Airflow. It covers creating custom operators, setting up notifications,
and monitoring for data anomalies. Configuration of notifications for tools such as Slack is also covered
to stay updated on the data ingestion process.
Chapter 11, Automating Your Data Ingestion Pipelines, focuses on automating data ingests using
previously learned best practices, enabling reader autonomy. It addresses common challenges with
schedulers or orchestration tools and provides solutions to avoid problems in production clusters.
Chapter 12, Using Data Observability for Debugging, Error Handling, and Preventing Downtime,
explores data observability concepts, popular monitoring tools such as Grafana, and best practices
for log storage and data lineage. It also covers creating visualization graphs to monitor data source
issues using Airflow configuration and data ingestion scripts.
Preface xvii

To get the most out of this book


To execute the code in this book, you must have at least a basic knowledge of Python. We will use
Python as the core language to execute the code. The code examples have been tested using Python
3.8. However, it is expected to still work with future language versions.
Along with Python, this book uses Docker to emulate data systems and applications in our local
machine, such as PostgreSQL, MongoDB, and Airflow. Therefore, a basic knowledge of Docker is
recommended to edit container image files and run and stop containers.
Please, remember that some command-line commands may need adjustments depending on your local
settings or operating system. The commands in the code examples are based on the Linux command-
line syntax and might need some adaptations to run on Windows PowerShell.

Software/Hardware covered in the book OS Requirements

Python 3.8 or higher Windows, Mac OS X, and Linux (any)


Docker Engine 24.0 / Docker Desktop 4.19 Windows, Mac OS X, and Linux (any)

For almost all recipes in this book, you can use a Jupyter Notebook to execute the code. Even though it
is not mandatory to install it, this tool can help you to test the code and try new things on the code due
to the friendly interface.
If you are using the digital version of this book, we advise you to type the code yourself or access
the code via the GitHub repository (link available in the next section). Doing so will help you
avoid any potential errors related to the copying and pasting of code.

Download the example code files


You can download the example code files for this book from GitHub at https://github.com/
PacktPublishing/Data-Ingestion-with-Python-Cookbook. In case there’s an update
to the code, it will be updated on the existing GitHub repository.
We also have other code bundles from our rich catalog of books and videos available at https://
github.com/PacktPublishing/. Check them out!

Download the color images


We also provide a PDF file that has color images of the screenshots/diagrams used in this book. You
can download it here: https://packt.link/xwl0U
xviii Preface

Conventions used
There are a number of text conventions used throughout this book.
Code in text: Indicates code words in text, database table names, folder names, filenames, file
extensions, pathnames, dummy URLs, user input, and Twitter handles. Here is an example: “Then
we proceeded with the with open statement.”
A block of code is set as follows:

def gets_csv_first_line (csv_file):


    logging.info(f"Starting function to read first line")
    try:
        with open(csv_file, 'r') as file:
            logging.info(f"Reading file")

Any command-line input or output is written as follows:

$ python3 –-version
Python 3.8.10

Bold: Indicates a new term, an important word, or words that you see onscreen. For example, words
in menus or dialog boxes appear in the text like this. Here is an example: “Then, when we selected
showString at NativeMethodAccessorImpl.java:0, which redirected us to the
Stages page.”

Tips or important notes


Appear like this.

Sections
In this book, you will find several headings that appear frequently (Getting ready, How to do it..., How
it works..., There’s more..., and See also).
To give clear instructions on how to complete a recipe, use these sections as follows:

Getting ready
This section tells you what to expect in the recipe and describes how to set up any software or any
preliminary settings required for the recipe.

How to do it…
This section contains the steps required to follow the recipe.
Preface xix

How it works…
This section usually consists of a detailed explanation of what happened in the previous section.

There’s more…
This section consists of additional information about the recipe in order to make you more knowledgeable
about the recipe.

See also
This section provides helpful links to other useful information for the recipe.

Get in touch
Feedback from our readers is always welcome.
General feedback: If you have questions about any aspect of this book, mention the book title in the
subject of your message and email us at [email protected].
Errata: Although we have taken every care to ensure the accuracy of our content, mistakes do happen.
If you have found a mistake in this book, we would be grateful if you would report this to us. Please
visit www.packtpub.com/support/errata, selecting your book, clicking on the Errata
Submission Form link, and entering the details.
Piracy: If you come across any illegal copies of our works in any form on the Internet, we would
be grateful if you would provide us with the location address or website name. Please contact us at
[email protected] with a link to the material.
If you are interested in becoming an author: If there is a topic that you have expertise in and you
are interested in either writing or contributing to a book, please visit authors.packtpub.com.
xx Preface

Share Your Thoughts


Once you’ve read Data Ingestion with Python Cookbook, we’d love to hear your thoughts! Please
click here to go straight to the Amazon review page for this book and share
your feedback.
Your review is important to us and the tech community and will help us make sure we’re delivering
excellent quality content.
Preface xxi

Download a free PDF copy of this book


Thanks for purchasing this book!
Do you like to read on the go but are unable to carry your print books everywhere?
Is your eBook purchase not compatible with the device of your choice?
Don’t worry, now with every Packt book you get a DRM-free PDF version of that book at no cost.
Read anywhere, any place, on any device. Search, copy, and paste code from your favorite technical
books directly into your application.
The perks don’t stop there, you can get exclusive access to discounts, newsletters, and great free content
in your inbox daily
Follow these simple steps to get the benefits:

1. Scan the QR code or visit the link below

https://packt.link/free-ebook/9781837632602

2. Submit your proof of purchase


3. That’s it! We’ll send your free PDF and other benefits to your email directly
Part 1:
Fundamentals
of Data Ingestion

In this part, you will be introduced to the fundamentals of data ingestion and data engineering,
passing through the basic definition of an ingestion pipeline, the common types of data sources, and
the technologies involved.
This part has the following chapters:

• Chapter 1, Introduction to Data Ingestion


• Chapter 2, Principals of Data Access – Accessing Your Data
• Chapter 3, Data Discovery – Understanding Our Data Before Ingesting It
• Chapter 4, Reading CSV and JSON Files and Solving Problems
• Chapter 5, Ingesting Data from Structured and Unstructured Databases
• Chapter 6, Using PySpark with Defined and Non-Defined Schemas
• Chapter 7, Ingesting Analytical Data
1
Introduction to Data Ingestion
Welcome to the fantastic world of data! Are you ready to embark on a thrilling journey into data
ingestion? If so, this is the perfect book to start! Ingesting data is the first step into the big data world.
Data ingestion is a process that involves gathering and importing data and also storing it properly
so that the subsequent extract, transform, and load (ETL) pipeline can utilize the data. To make it
happen, we must be cautious about the tools we will use and how to configure them properly.
In our book journey, we will use Python and PySpark to retrieve data from different data sources
and learn how to store them properly. To orchestrate all this, the basic concepts of Airflow will be
implemented, along with efficient monitoring to guarantee that our pipelines are covered.
This chapter will introduce some basic concepts about data ingestion and how to set up your
environment to start the tasks.
In this chapter, you will build and learn the following recipes:

• Setting up Python and the environment


• Installing PySpark
• Configuring Docker for MongoDB
• Configuring Docker for Airflow
• Logging libraries
• Creating schemas
• Applying data governance in ingestion
• Implementing data replication
4 Introduction to Data Ingestion

Technical requirements
The commands inside the recipes of this chapter use Linux syntax. If you don’t use a Linux-based
system, you may need to adapt the commands:

• Docker or Docker Desktop


• The SQL client of your choice (recommended); we recommend DBeaver, since it has a
community-free version

You can find the code from this chapter in this GitHub repository: https://github.com/
PacktPublishing/Data-Ingestion-with-Python-Cookbook.

Note
Windows users might get an error message such as Docker Desktop requires a newer WSL
kernel version. This can be fixed by following the steps here: https://docs.docker.
com/desktop/windows/wsl/.

Setting up Python and its environment


In the data world, languages such as Java, Scala, or Python are commonly used. The first two languages
are used due to their compatibility with the big data tools environment, such as Hadoop and Spark,
the central core of which runs on a Java Virtual Machine (JVM). However, in the past few years, the
use of Python for data engineering and data science has increased significantly due to the language’s
versatility, ease of understanding, and many open source libraries built by the community.

Getting ready
Let’s create a folder for our project:

1. First, open your system command line. Since I use the Windows Subsystem for Linux (WSL),
I will open the WSL application.
2. Go to your home directory and create a folder as follows:
$ mkdir my-project

3. Go inside this folder:


$ cd my-project

4. Check your Python version on your operating system as follows:


$ python -–version
Setting up Python and its environment 5

Depending on your operational system, you might or might not have output here – for example,
WSL 20.04 users might have the following output:
Command 'python' not found, did you mean:
command 'python3' from deb python3
command 'python' from deb python-is-python3

If your Python path is configured to use the python command, you will see output similar
to this:
Python 3.9.0

Sometimes, your Python path might be configured to be invoked using python3. You can
try it using the following command:
$ python3 --version

The output will be similar to the python command, as follows:


Python 3.9.0

5. Now, let’s check our pip version. This check is essential, since some operating systems have
more than one Python version installed:
$ pip --version

You should see similar output:


pip 20.0.2 from /usr/lib/python3/dist-packages/pip (python 3.9)

If your operating system (OS) uses a Python version below 3.8x or doesn’t have the language
installed, proceed to the How to do it steps; otherwise, you are ready to start the following Installing
PySpark recipe.

How to do it…
We are going to use the official installer from Python.org. You can find the link for it here: https://
www.python.org/downloads/:

Note
For Windows users, it is important to check your OS version, since Python 3.10 may not be
yet compatible with Windows 7, or your processor type (32-bits or 64-bits).

1. Download one of the stable versions.


At the time of writing, the stable recommended versions compatible with the tools and resources
presented here are 3.8, 3.9, and 3.10. I will use the 3.9 version and download it using the
following link: https://www.python.org/downloads/release/python-390/.
Scrolling down the page, you will find a list of links to Python installers according to OS, as shown
in the following screenshot.
6 Introduction to Data Ingestion

Figure 1.1 – Python.org download files for version 3.9

2. After downloading the installation file, double-click it and follow the instructions in the wizard
window. To avoid complexity, choose the recommended settings displayed.
The following screenshot shows how it looks on Windows:

Figure 1.2 – The Python Installer for Windows


Setting up Python and its environment 7

3. If you are a Linux user, you can install it from the source using the following commands:
$ wget https://www.python.org/ftp/python/3.9.1/Python-3.9.1.tgz

$ tar -xf Python-3.9.1.tgz

$ ./configure –enable-optimizations

$ make -j 9

After installing Python, you should be able to execute the pip command. If not, refer to the pip
official documentation page here: https://pip.pypa.io/en/stable/installation/.

How it works…
Python is an interpreted language, and its interpreter extends several functions made with C or
C++. The language package also comes with several built-in libraries and, of course, the interpreter.
The interpreter works like a Unix shell and can be found in the usr/local/bin directory: https://
docs.python.org/3/tutorial/interpreter.html.
Lastly, note that many Python third-party packages in this book require the pip command to be
installed. This is because pip (an acronym for Pip Installs Packages) is the default package manager
for Python; therefore, it is used to install, upgrade, and manage the Python packages and dependencies
from the Python Package Index (PyPI).

There’s more…
Even if you don’t have any Python versions on your machine, you can still install them using the
command line or HomeBrew (for macOS users). Windows users can also download them from the
MS Windows Store.

Note
If you choose to download Python from the Windows Store, ensure you use an application
made by the Python Software Foundation.

See also
You can use pip to install convenient third-party applications, such as Jupyter. This is an open source,
web-based, interactive (and user-friendly) computing platform, often used by data scientists and data
engineers. You can install it from the official website here: https://jupyter.org/install.
8 Introduction to Data Ingestion

Installing PySpark
To process, clean, and transform vast amounts of data, we need a tool that provides resilience and
distributed processing, and that’s why PySpark is a good fit. It gets an API over the Spark library that
lets you use its applications.

Getting ready
Before starting the PySpark installation, we need to check our Java version in our operational system:

1. Here, we check the Java version:


$ java -version

You should see output similar to this:


openjdk version "1.8.0_292"
OpenJDK Runtime Environment (build 1.8.0_292-8u292-b10-
0ubuntu1~20.04-b10)
OpenJDK 64-Bit Server VM (build 25.292-b10, mixed mode)

If everything is correct, you should see the preceding message as the output of the command
and the OpenJDK 18 version or higher. However, some systems don’t have any Java version
installed by default, and to cover this, we need to proceed to step 2.
2. Now, we download the Java Development Kit (JDK).
Go to https://www.oracle.com/java/technologies/downloads/, select
your OS, and download the most recent version of JDK. At the time of writing, it is JDK 19.
The download page of the JDK will look as follows:
Installing PySpark 9

Figure 1.3 – The JDK 19 downloads official web page

Execute the downloaded application. Click on the application to start the installation process.
The following window will appear:

Note
Depending on your OS, the installation window may appear slightly different.
10 Introduction to Data Ingestion

Figure 1.4 – The Java installation wizard window

Click Next for the following two questions, and the application will start the installation.
You don’t need to worry about where the JDK will be installed. By default, the application is
configured, as standard, to be compatible with other tools’ installations.
3. Next, we again check our Java version. When executing the command again, you should see
the following version:
$ java -version
openjdk version "1.8.0_292"
OpenJDK Runtime Environment (build 1.8.0_292-8u292-b10-
0ubuntu1~20.04-b10)
OpenJDK 64-Bit Server VM (build 25.292-b10, mixed mode)

How to do it…
Here are the steps to perform this recipe:

1. Install PySpark from PyPi:


$ pip install pyspark
Installing PySpark 11

If the command runs successfully, the installation output’s last line will look like this:
Successfully built pyspark
Installing collected packages: py4j, pyspark
Successfully installed py4j-0.10.9.5 pyspark-3.3.2

2. Execute the pyspark command to open the interactive shell. When executing the pyspark
command in your command line, you should see this message:
$ pyspark
Python 3.8.10 (default, Jun 22 2022, 20:18:18)
[GCC 9.4.0] on linux
Type "help", "copyright", "credits" or "license" for more
information.
22/10/08 15:06:11 WARN Utils: Your hostname, DESKTOP-DVUDB98
resolves to a loopback address: 127.0.1.1; using 172.29.214.162
instead (on interface eth0)
22/10/08 15:06:11 WARN Utils: Set SPARK_LOCAL_IP if you need to
bind to another address
22/10/08 15:06:13 WARN NativeCodeLoader: Unable to load native-
hadoop library for your platform... using builtin-java classes
where applicable
Using Spark's default log4j profile: org/apache/spark/log4j-
defaults.properties
Setting default log level to "WARN".
To adjust logging level use sc.setLogLevel(newLevel). For
SparkR, use setLogLevel(newLevel).
Welcome to
      ____              __
     / __/__  ___ _____/ /__
    _\ \/ _ \/ _ `/ __/  '_/
   /__ / .__/\_,_/_/ /_/\_\   version 3.1.2
      /_/

Using Python version 3.8.10 (default, Jun 22 2022 20:18:18)


Spark context Web UI available at http://172.29.214.162:4040
Spark context available as 'sc' (master = local[*], app id =
local-1665237974112).
SparkSession available as 'spark'.
>>>

You can observe some interesting messages here, such as the Spark version and the Python
used from PySpark.
3. Finally, we exit the interactive shell as follows:
>>> exit()
$
12 Introduction to Data Ingestion

How it works…
As seen at the beginning of this recipe, Spark is a robust framework that runs on top of the JVM. It is
also an open source tool for creating resilient and distributed processing output from vast data. With
the growth in popularity of the Python language in the past few years, it became necessary to have a
solution that adapts Spark to run alongside Python.
PySpark is an interface that interacts with Spark APIs via Py4J, dynamically allowing Python code to
interact with the JVM. We first need to have Java installed on our OS to use Spark. When we install
PySpark, it already comes with Spark and Py4J components installed, making it easy to start the
application and build the code.

There’s more…
Anaconda is a convenient way to install PySpark and other data science tools. This tool encapsulates all
manual processes and has a friendly interface for interacting with and installing Python components,
such as NumPy, pandas, or Jupyter:

1. To install Anaconda, go to the official website and select Products | Anaconda


Distribution: https://www.anaconda.com/products/distribution.
2. Download the distribution according to your OS.

For more detailed information about how to install Anaconda and other powerful commands, refer
to https://docs.anaconda.com/.

Using virtualenv with PySpark

It is possible to configure and use virtualenv with PySpark, and Anaconda does it automatically
if you choose this type of installation. However, for the other installation methods, we need to make
some additional steps to make our Spark cluster (locally or on the server) run it, which includes
indicating the virtualenv /bin/ folder and where your PySpark path is.

See also
There is a nice article about this topic, Using VirtualEnv with PySpark, by jzhang, here: https://
community.cloudera.com/t5/Community-Articles/Using-VirtualEnv-with-
PySpark/ta-p/245932.
Configuring Docker for MongoDB 13

Configuring Docker for MongoDB


MongoDB is a Not Only SQL (NoSQL) document-oriented database, widely used to store Internet
of Things (IoT) data, application logs, and so on. A NoSQL database is a non-relational database that
stores unstructured data differently from relational databases such as MySQL or PostgreSQL. Don’t
worry too much about this now; we will cover it in more detail in Chapter 5.
Your cluster production environment can handle huge amounts of data and create resilient data storage.

Getting ready
Following the good practice of code organization, let’s start creating a folder inside our project to
store the Docker image:
Create a folder inside our project directory to store the MongoDB Docker image and data as follows:
my-project$ mkdir mongo-local
my-project$ cd mongo-local

How to do it…
Here are the steps to try out this recipe:

1. First, we pull the Docker image from Docker Hub as follows:


my-project/mongo-local$ docker pull mongo

You should see the following message in your command line:


Using default tag: latest
latest: Pulling from library/mongo
(...)
bc8341d9c8d5: Pull complete
(...)
Status: Downloaded newer image for mongo:latest
docker.io/library/mongo:latest

Note
If you are a WSL user, an error might occur if you use the WSL 1 version instead of version 2.
You can easily fix this by following the steps here: https://learn.microsoft.com/
en-us/windows/wsl/install.
14 Introduction to Data Ingestion

2. Then, we run the MongoDB server as follows:


my-project/mongo-local$ docker run \
--name mongodb-local \
-p 27017:27017 \
-e MONGO_INITDB_ROOT_USERNAME="your_username" \
-e MONGO_INITDB_ROOT_PASSWORD="your_password"\
-d mongo:latest

We then check our server. To do this, we can use the command line to see which Docker
images are running:
my-project/mongo-local$ docker ps

We then see this on the screen:

Figure 1.5 – MongoDB and Docker running container

We can even check on the Docker Desktop application to see whether our container is running:

Figure 1.6 – The Docker Desktop vision of the MongoDB container running

3. Finally, we need to stop our container. We need to use Container ID to stop the container,
which we previously saw when checking the Docker running images. We will rerun it in Chapter 5:
my-project/mongo-local$ docker stop 427cc2e5d40e

How it works…
MongoDB’s architecture uses the concept of distributed processing, where the main node interacts with
clients’ requests, such as queries and document manipulation. It distributes the requests automatically
among its shards, which are a subset of a larger data collection here.
Configuring Docker for MongoDB 15

Figure 1.7 – MongoDB architecture

Since we may also have other running projects or software applications inside our machine, isolating
any database or application server used in development is a good practice. In this way, we ensure
nothing interferes with our local servers, and the debug process can be more manageable.
This Docker image setting creates a MongoDB server locally and even allows us to make additional
changes if we want to simulate any other scenario for testing or development.
The commands we used are as follows:

• The --name command defines the name we give to our container.


• The -p command specifies the port our container will open so that we can access it
via localhost:27017.
• -e command defines the environment variables. In this case, we set the root username and
password for our MongoDB container.
• -d is detached mode – that is, the Docker process will run in the background, and we will
not see input or output. However, we can still use docker ps to check the container status.
• mongo:latest indicates Docker pulling this image’s latest version.
16 Introduction to Data Ingestion

There’s more…
For frequent users, manually configuring other parameters for the MongoDB container, such as the
version, image port, database name, and database credentials, is also possible.
A version of this image with example values is also available as a docker-compose file in the official
documentation here: https://hub.docker.com/_/mongo.
The docker-compose file for MongoDB looks similar to this:
# Use your own values for username and password
version: '3.1'

services:

  mongo:
    image: mongo
    restart: always
    environment:
      MONGO_INITDB_ROOT_USERNAME: root
      MONGO_INITDB_ROOT_PASSWORD: example

  mongo-express:
    image: mongo-express
    restart: always
    ports:
      - 8081:8081
    environment:
      ME_CONFIG_MONGODB_ADMINUSERNAME: root
      ME_CONFIG_MONGODB_ADMINPASSWORD: example
      ME_CONFIG_MONGODB_URL: mongodb://root:example@mongo:27017/

See also
You can check out MongoDB at the complete Docker Hub documentation here: https://hub.
docker.com/_/mongo.

Configuring Docker for Airflow


In this book, we will use Airflow to orchestrate data ingests and provide logs to monitor our pipelines.
Airflow can be installed directly on your local machine and any server using PyPi (https://pypi.
org/project/apache-airflow/) or a Docker container (https://hub.docker.com/r/
apache/airflow). An official and supported version of Airflow can be found on Docker Hub,
and the Apache Foundation community maintains it.
Configuring Docker for Airflow 17

However, there are some additional steps to configure our Airflow. Thankfully, the Apache Foundation
also has a docker-compose file that contains all other requirements to make Airflow work. We
just need to complete a few more steps.

Getting ready
Let’s start by initializing our Docker application on our machine. You can use the desktop version or
the CLI command.
Make sure you are inside your project folder for this. Create a folder to store Airflow internal components
and the docker-compose.yaml file:
my-project$ mkdir airflow-local
my-project$ cd airflow-local

How to do it…
1. First, we fetch the docker-compose.yaml file directly from the Airflow official docs:
my-project/airflow-local$ curl -LfO 'https://airflow.apache.org/
docs/apache-airflow/2.3.0/docker-compose.yaml'

You should see output like this:

Figure 1.8 – Airflow container image download progress

Note
Check the most stable version of this docker-compose file when you download it, since
new, more appropriate versions may be available after this book is published.

2. Next, we create the dags, logs, and plugins folders as follows:


my-project/airflow-local$ mkdir ./dags ./logs ./plugins

3. Then, we create and set the Airflow user as follows:


my-project/airflow-local$ echo -e "AIRFLOW_UID=$(id -u)\
nAIRFLOW_GID=0" > .env
Exploring the Variety of Random
Documents with Different Content
The Project Gutenberg eBook of Ampiaispesä
This ebook is for the use of anyone anywhere in the United States
and most other parts of the world at no cost and with almost no
restrictions whatsoever. You may copy it, give it away or re-use it
under the terms of the Project Gutenberg License included with this
ebook or online at www.gutenberg.org. If you are not located in the
United States, you will have to check the laws of the country where
you are located before using this eBook.

Title: Ampiaispesä
Kyläkertomus

Author: Veikko Korhonen

Release date: December 8, 2023 [eBook #72357]

Language: Finnish

Original publication: Oulu: Pohjolan Kustannus Oy, 1917

Credits: Anna Siren and Tapio Riikonen

*** START OF THE PROJECT GUTENBERG EBOOK


AMPIAISPESÄ ***
AMPIAISPESÄ

Kyläkertomus

Kirj.

VEIKKO KORHONEN

Oulussa, Pohjolan Kustannus-Osakeyhtiö, 1917.

I.
Maaliskuu oli lopuillaan. Kolmojoki oli luonut jääpeitteensä ja
virtaili tasaisesti lämpimässä auringon paisteessa.
Kolmojoki oli aikoinaan virtaillut koskemattoman metsän läpi.
Vähitellen sen rannoille oli muodostunut viljelyksiä ja taloja, ja nyt se
jo eroitti toisistaan kaksi kyläkuntaa, jotka olivat sen äyräille
muodostuneet. Kyläkunta olisi oikeastaan sopinut olemaan yhtenä,
mutta se oli jotenkuten eroittunut kahdeksi. Joen pohjoispuolinen
kyläkunta sai joesta nimensä ja eteläistä sanottiin Korpijoeksi,
koskapa sen kylän asukkaat vieläkin väittivät Kolmojokea aikoinaan
sanotun Korpijoeksi.

Korpijoen kylässä on ainoastaan muutamia huomattavia taloja.


Mikkola, kylän rehevin talo, on keskuksena ja siinä isäntänä Iisakki,
Hämeestä aikoinaan muuttanut vanhapoika. Mainittava on myöskin
Miirun talo, jossa toimeliaana isäntänä hääräilee Jooseppi. Hänellä
on vaimona teräväkielinen Eveliina ja Eveliinalla Eedla-niminen tytär,
ainoa talossa.

Kertomuksen vuoksi on myöskin mainittava, että Miirun peltojen


päässä on mökki, jossa asuu räätäli Romppanen.

Mutta joen toiselta puolelta näkyy myöskin talojen kattoja.


Näkyvätpä Ylä-Rietulan katot kaikkein kauimmaksi, ja savupiiputkin
ovat niissä lukuisammat kuin toisissa taloissa, lukuunottamatta
Mikkolaa, Korpijoen taloa.

Hieman alempana notkossa on Ala-Rietula, ränsistynyt


talopahanen, jonka päreillä paikatut akkunat katselevat kuin avuton
sokea kylään, missä talojen ulkomuoto paranee vuosi vuodelta, Ala-
Rietulan jäädessä yhä katselemaan puolisokeana edistyksen kulkua
Kolmon kylässä.

Vielä on mainittava Möttösen talo toisella puolella valtamaantietä


Ylä-Rietulan naapurina. Se on myöhemmin rakennettu kuin toiset
talot ja seinät kuultavat, vielä vaalean harmaina, kun sen sijaan
toisten talojen seiniin on aika lyönyt tumman värinsä.

Ylä-Rietulaa hallitsee Mooses Rietula, pyöristynyt vanhapoika ja


lautamies. Lyhyet raajat, jotka näyttävät kuin musertuvan
omistajansa painosta, ovatkin jo hieman vääristyneet. Kapeat hartiat
keskiruumiiseen verraten ja päässä takkuinen tukka, joka pörröttää
rikkinäisen viltin lierien alta sakeana pöyrynä. Lihavat kasvot
näyttävät ensi katsannolla hyväntahtoisilta, mutta lähemmin
tarkasteltua on niissä salakavala ilme, joka on samalla ärtyinen.
Mutta tästä huolimatta Rietula nauraakin joskus niin että vatsa
lainehtii.

Ala-Rietulassa liikehtii verkkaan viisikymmenissä oleva Vernand,


laiha ukon käppyrä. Vernandin kapeissa, luisevissa kasvoissa ovat
punoittavat silmät, jotka näyttävät aina ihmetellen katselevan
ympäristöään.

Vernandilla on myöskin poika, Hesekiel, joka on ilmetty isänsä


kuva, vain hiukkasta pienempi. Samat ihmettelevät silmät ja samat
luisevat kasvot. Liikkeissäänkin yhtä verkkainen. Emäntä on kuollut
Vernandilta eikä hän ole tullut vielä uutta ottaneeksi.

Möttösessä on isäntänä Eerikki ja hänestä ei paljoa kerrotakaan.


Hänellä on sitävastoin sisar, Taava, lihava vanhapiika, joka on
yrittänyt kolmasti miehelään, mutta aviotoveri on hänet aina
viimetingassa pumpannut takaisin Möttöseen ja siinä Taava on vain
veljensä taloa hoidellut ja paisunut entistään pyöreämmäksi. Taava
on sukkela suustaan, kuten tavallisesti savolaiset sisarensa. Ja
hänellä on tarkat korvat. Mikään juorujuttu ei mene hänen korviensa
ohi. Kuulemastaan hän tekee omat johtopäätöksensä, joihin toisten
talojen emäntien on napisematta mukauduttava.
Yksi kyläkunta, mutta kaksi nimeä.

Kyläkuntien väliä on vain muutamisen sataa askelta, niin että


selkeällä ilmalla saattaa pienempikin puhe kuulua yli joen toiselle
puolelle. Tästä huolimatta ovat kylien asukkaitten välit olleet riitaiset.
Salapuheet ja roskajuorut ovat asukkailla jokapäiväisenä ruokana.
Jos Kolmossa tapahtuu onnettomuus, niin siitä Korpijoella salaisesti
iloitaan, ja jos korpijokelaisia onni potkaisee, niin Kolmossa saattaa
joku isäntä tai emäntä tulla pahoinvoivaksi.

Mikkolan isäntä Iisakki, muutettuaan tänne Hämeestä, aikoi käydä


kylien pahaa sopua parantamaan, mutta toimenpiteestään joutui
kolmolaisten, jopa kyläläistensäkin, vihoihin. Ja kun Iisakki on
turpeasta olemuksestaan huolimatta hieman kumaraharteinen,
alettiin häntä ensin Kolmon puolella haukkua kyrmyniskaksi, ja
vähitellen tämä nimi tuli käytäntöön hänen omien kyläläistensäkin
keskuudessa. Asianomainen aikoi ensialussa harata nimensä
muutosta vastaan, mutta taipui vähitellen, ja Kyrmyniskaksi häntä nyt
sanotaan koko Kuivalan pitäjässä.

On mainittava, että kyläkuntiin tulee kerran viikossa posti, joka tuo


jokusen sanomalehden kylän vauraimpiin taloihin. Ja siinä on kaikki
henkinen viljelys, lukuunottamatta kituvaa raittiusseuraa ja kylien
keskeisiä juorupuheita, joilla asianomaiset ravitsevat itseään
kotoisista pelloista saadun viljan ohella.
II.

Lämpimät paisteet olivat sulatelleet hankia, ja päivisin tiet jo upottivat


ja kallistuivat yhä enemmän vinoon. Muutamissa paikoin näkyi jo
sulaa maata jalaksen uurnassa ja tiekin oli käynyt rapakoiseksi.

Kyrmyniska käveli verkalleen kallistunutta peltotietä ja myhähteli


itsekseen. Kevät näytti tulevan tavallista aikaisempaan. Päiväkulta
paistaa lekotti lämpimästi ja öillä oli taivas pilvessä.

— Kohta siitä alkaa kevätkalan pyynti, murahti mies ääneen,


tultuaan pihatörmälle, johon näkyi virtaileva joki alempana rannassa,
— joko lienee Rietula rysänsä tupannut joen alajuoksuun? murahteli
Kyrmyniska edelleen ja kuin vastausta saadakseen jäi katselemaan
Kolmon puolelle Rietulan peltoja ja pihamaata, jotka hyvin sopivat
näkymään Mikkolan pihaan.

Rietula näytti seisovan hänkin talonsa piharakennuksen nurkalla ja


katselevan Mikkolaan päin.

— Keh, mitähän se nyt siellä vahtaa, myhähti Kyrmyniska ja


silmäsi omille vainioilleen, joilla pohotti pitkä rivi lantakasoja, jotka
olivat olleet aina lukuisammat hänen pelloillaan.
— Niitä se siellä tarkkailee… kai lukeakseen. Saaneeko luetuksi.
Kolmekymmentä kaksi niitä on, ja viisitoista on vaan Rietulan
pelloilla. Heh, mitäpä tuosta. Olkoon mitä on, mutta kateena se niitä
katselee.

Iisakki pyörähti tupaan, otti orrelta talvella korjaamansa haukirysät


alas ja sitoi ne kimppuun. Vetäistyään rasvapieksut jalkaansa, painui
ulos rysänippu kainalossa joen rantaan. Saatuaan venheen vesille,
antoi hän sen hiljaa lipua virran mukana ja jäi katselemaan kirkkaasti
välkehtivää veden pintaa.

Iisakki oli ollut pahalla tuulella useita viikkoja yhtämittaa tietämättä


siihen syytä oikein itsekään. Jokin outo, ellottava tunne oli häntä
painanut. Oliko kyläläisten riitaisuus, jota hän oli koettanut voimiensa
mukaan musertaa, painanut mieltä, vai yksinäinen vanhanpojan
elämäkö kävi tympäiseväksi?

Mutta nyt siinä venheen keinuessa hiljaa eteenpäin, tunsi Iisakki


aivan yhtäkkiä käyvän mielensä hyväksi. Hymy herahti suupieleen ja
povessa sykähti niin kuin ennen nuorena miehenä.

Päivä paistoi lämpimästi, hanget alenivat ja Mikkolan vainiot


paljastuivat lumen alta tuoden esiin kauniit oraat. Hyvinpä olivatkin
säilyneet talven alla. Valtava vilja siinä taas lainehtii kesän tultua.

Iisakki tarttui airoihin ja vetäisi voimakkaasti rintaa paisuttavan


hyvän mielen vallassa. Mutta lahoneet hankavitsat rouskahtivat
poikki, ja Iisakin täytyi istua perään melomaan.

Iisakin suu kiertyi leveään hymyyn ohjatessaan venhettä joen


suuhun. Mistä se nyt tosiaankin tämä hyvänmielen tunne pulpahti
niin yhtäkkiä? Tämä kaunis kevätköhän se vielä saisi vanhat veret
liikkeelle? Heh, olipa mistä oli ja tulkoon mistä tulee, kunhan on hyvä
olla, eikä aina mieltä paina jäytävä alakuloisuus. Pistetään rysät
entisiin kalapaikkoihin, keitetään kalaa ja odotellaan kesää. Ja siinä
sivussa ojennetaan riitaisia kyläläisiä sovinnon tielle. Ojennetaan,
neuvotaan, vaikkapa siitä murtavatkin suuta ja haukkuvat
Kyrmyniskaksi.

Venheen kokka kahahti rantakaislikkoon, mutta Iisakki ei malttanut


vielä nousta rysiä laittamaan, vaan jäi edelleen miettimään.

Kymmenen vuotta sitä on jo Mikkolassa eletty. Mikä lienee silloin


saanut Hämeestä tänne muuttamaan ja kauniit syntymäseudut
jättämään. Niinkuin olisi muka täällä paremmat maat olleet ja
kalavedet. Kadutti kaupat ensin muutamia vuosia ja ikävä oli
Hämeeseen, vaan siinähän tuo on tasaantunut, ja talo on noussut ja
pellot kasvavat nyt jo niin että kuuluu kylälle asti.

Talonsa on saanut nousemaan, kun on puuhannut, mutta eipä ole


naapurein välit parantuneet, vaikka olisi kuinka saarnannut.
Riidellään ja hosataan yhtämittaa ja milloin ei julkisesti riidellä, niin
silloin takanapäin jurnutetaan ja puhutaan pahaa ja arvotonta
toisistaan. Mutta olkoon miten on. Eikö tästä puolin jääne
sovintoyritykset sikseen. Sekö heille ikänsä saarnaamaan! Heh,
riidellään sitten, kun kerran se on mieleisempää. Riidellään ja
hosataan ja tapellaankin, jos niin tarvitaan. On sitä
Kyrmyniskassakin sisua, jos niikseen tulee.

Iisakki pisti piippuunsa, sylkäisi, pisteeksi mietteilleen ja nousi


ketterästi laittamaan rysiä kuntoon. Jalka nousi keveämmin kuin
ennen ja hyvä mieli tuntui vaan paisuvan.
Iisakki oli saanut jo ensimäiset rysänsä jokeen ja aikoi viimeisiä
asettaa entisiin paikkoihinsa joen viimeisessä mutkassa, kun hän
hätkähti jo ihmeissään seisomaan.

— Kuka pirhana siihen jo ehti rysänsä, virkkoi katsellessaan


entisiä rysän paikkoja, joihin oli jo pyydykset pantuna.

Iisakki seisoi kysymysmerkkinä. Äskeinen hyvä mieli tuntui


alenevan.

— Kuka kehveli se…

Sattui siinä Iisakki kääntämään päätään ja huomasi rannalla


Rietulan seisomassa ja virnistelemässä.

— Kas kun naapuri on pistänyt siihen jo rysänsä likoon, virkkoi


Iisakki. Mutta mitenkähän se on, kun minä olen siinä tottunut ennen
pyydyksiäni pitämään?

Miehet kyyräsivät vastakkain. Rietulan leuka näytti värähtävän.

— Sinähän niitä olet tässä joessa parhaita pyyntipaikkoja tähän


asti pitänyt, vaan vuoro se on kerran minullakin, sanoi Rietula.

Iisakki näytti aprikoivan, alkaisiko haastaa riitaa vai koettaisiko


sovinnolla selviytyä naapuristaan.

— Lieneekö ne tässä rysänpaikat parempia kuin muuallakaan. Ja


kun minä tässä olen pitänyt ennenkin enkä ole sinun pyyntipaikoillesi
pyrkinyt, niin eiköhän sovittaisi pyytämään niin kuin ennenkin riitaa
haastamatta, arveli Iisakki.

Rietula oli tullut muutaman askeleen lähemmäksi ja kivahti:


— Elä puhu mitään entisistä pyyntipaikoista. Kun muutit
Mikkolaan, valtasit tämän paikan, enkä kehdannut pois ajaa, mutta
nyt ajetaan. Ja jos et sitä usko, niin koetetaan!

Ja Rietula sylkäsi kouriinsa valmiina käymään käsirysyyn, jos


tarvittaisi.

Iisakinkin mieli myrtyi ja hän purasi piipun vartta, joka sattui


olemaan hampaissa, niin että pala lohkesi suuhun. Mutta riitaa ei
mies sen pitemmältä käynyt haastamaan. Lähti astumaan ja virkkoi
mennessään Rietulalle:

— Tulehan aamulla Mikkolaan sampiaiskeitolle. Pistetään


kahviksikin ja vielä on putelissa pikkuisen, josta pulitetaan sekaan.
Olen parhaimpia vieraita varten säästellyt.

Rietula kuului kiroavan kiitokseksi lähtiessään soutamaan.


III.

Iisakki istui kamarissaan keinutuolissa ja antoi sen hiljaa liikkua.


Iltapäivän aurinko paistoi ikkunasta sisään ja muodosti kirkkaan
valojuovan lattiapalkeille. Könniläinen mittasi aikaa verkalleen.

Iisakin piippu oli sammunut ja sitä pitävä käsi valahtanut


riippumaan tuolin kaiteen yli. Miehen otsalla oli syvät mieterypyt.

Kyllä vain korpijokelaiset ja kolmolaiset olivat asettaneet hänet


kovalle koetukselle. Hän oli jo päättänyt, ettei kajoo heidän
riitoihinsa, vaan pysyy kaikista erillään, mutta myttyyn meni se
päätös.

Kylät olivat päättäneet perustaa yhteisen osuuskaupan ja asiasta


oli jo pidetty kokouksia, ja osuudet olivat merkityt, vaan paikasta oli
syntynyt riitaa. Kolmolaiset tahtoivat kauppaa puolelleen ja samoin
vaatimuksin esiintyivät korpijokelaisetkin, vaatien kauppaa joen
rannalle, jossa oli sopiva kartano heidän kylänsä puolella.

Korpijokelaiset olivat käyneet tänään miehissä puhumassa Iisakille


asiasta. Miehet tulivat kiihtyneinä, hiukset pystyssä vaatimaan
Iisakkia sovittajaksi asiassa ja pitämään heidän puoltaan
kiistanalaisesta kaupan, paikasta.
Kokous oli iltapäivällä Miirussa, ja hänen täytyi lähteä sinne ja
varustautua hyvään hyökkäys- ja puolustuskuntoon. Puheenlahjaa
hänelle oli suotu, eikä hänen tarvinnut sitä edeltäpäin valmistella,
mutta täytyi miettiä muitakin keinoja, ja senpä takia mieterypyt vaan
hetki hetkeltä syvenivät Iisakin otsalla.

Varmasti oli riivaajainen mennyt kumpaistenkin kylien miehiin, kun


viitsivät kinata turhaa moisessa pikkuasiassa. Eihän kahta kauppaa
voinut laittaa ja niin neuvoin täytyi toisen tai toisen puolen tulla
kysymykseen.

Joen yli johti leveä maantiesilta ja joku irvihammas oli viime


kokouksessa ehdottanut, että rakennettaisiin kaupalle kartano joen
sillalle ja muutettaisiin maantie toisesta paikasta kulkemaan.
Muutamat isännät, varsinkin Miirun Jooseppi, olivat asiaan
innostuneetkin luullen ehdotuksen tekijällä toden olevan
kysymyksessä.

Iisakki myhähti. Vähän niille oli järkeä annettu, miespoloisille, sen


näki kaikista heidän puuhistaan.

Kello löi kumeasti viiden lyöntinsä muistuttaen Iisakille, että


kokoukseen lähdön aika oli käsillä. Mutta edelleen istui Iisakki ja
keinahteli. Hänen sisässään oli alkanut kuohua.

Menen ja sanon suorat sanat heille kaikille. Sanon vasten naamaa


enkä selän takana jurnuta, niinkuin he. Sanon, että perustakoot
kauppansa vaikka hiiteen, vaikka Kittilän kirkon takapuolelle.
Puuhatkaa niin kuin puuhaatte, rähiskää ja tapelkaa, hunsvotit!

Se olisi niille parhaiksi.


Isäntärenki raotti kamarin ovea ja virkkoi:

— Mitenkä se on isäntä, kun se kokous kohta alkaa ja… menkää


nyt joutuun, hyvä isäntä… tässä on kunnia kysymyksessä.

— Minä annan perhanat sille kokoukselle! murahti isäntä


noustessaan.

Renki painoi oven kiinni ja ihmetteli isäntänsä murahtelua.

— Ei ole nyt meidän ukko oikealla tolalla. Viime aikoina onkin


istunut ja miettinyt… sitä akattomuuttaanko surenee.

Ja kun isäntä laskeutui portailta ja meni aitan ohi maantielle, arveli


renki vielä työnsä keskeyttäen:

— Ei se tänään kävelekään sillä tavoin, että siinä olisi puolensa


pitäjätä. Mikä pahus sitä vaivaa…?

Iisakki kävellä köhnysteli joen sillalle ja siinä vasta huomasi, että


oli tullut ohi Miirun tiehaarasta. Aikoi kääntyä, mutta huomasi nais-
ihmisen joella pesupuuhissa. Kukahan se olikaan? Pitääpä katsoa
tarkemmin! Miirun Eedla. Eikös ollut Eedla tosiaankin vaatteita
karttuamassa!

Iisakki sanoi hyvän päivän ja nojasi kaidepuuhun.

— Päivää vain. Kokoukseenko se isäntä oli menossa?

Eedla näyttikin vastoin tavallisuutta olevan puhetuulella.

— Sinnehän tässä… Sattui tuossa vähän viemään ohi.


Iisakki kaivoi housuntaskusta piipun ja pisti hampaisiinsa
muistamatta sitä täyttää.

No, johan nyt! Ja eikös ollut jäänyt tupakkamassikin kotiin!


Kaikkea sitä…

Eedla läiskytteli kartulla vaatteita eikä välittänyt Iisakin puuhista.


Oli kietaissut hameensa koholle ja pistänyt helmat vyön alle. Paljaat,
pyöreät pohkeat jännittyivät somasti Eedlan kumartuessa vaatteita
huuhtomaan.

Iisakki unohtui katselemaan Eedlan puuhailua. Somapa sitä olikin


katsella. Nuori, terve ihminen ja lisäksi isotekoinen.

Ja siinä katsellessa johtui Iisakille mieleen eukottomuutensa,


yksinäiset ikävät päivänsä.

Jo häntä on mies hullu, kun rupeaa eukotta ikänsä elämään ja


kitumaan, vaikka talo on kuin linna miehellä. On se. Ja mikä ihme
siinä mahtoi ollakaan, ettei ennemmin tuo asia ollut johtunut mieleen.
Mutta nyt sattui. Veti kuin vetäjäinen tähän joelle, jossa tuo Eedla…
Se on näyttävä ihminen, vaikka sanovat sitä hieman tuhmaksi. Reilu
tyttö, olipa sitten järeltään mikä tahansa.

Iisakki aikoi sanoa jonkun sanan Eedlalle, ennenkuin lähtisi


kokoukseen.

— Joko niitä on Miirussa kevätkaloja keitetty? kysäisi.

— Eikö mitä… Oli se isä pannut rysän jokeen, mutta oli jättänyt
kalasimen auki. Se ukko on välistä semmoinen toljake, virkkoi Eedla.

— Vai jäi kalasin auki, nauroi Iisakki.


Eedla oli saanut vaatteet huuhdelluiksi ja kietaisi nyt Iisakista
välittämättä hameen yltään ja pisti sen lipeätiinuun pestäväksi.

— Eedla kävisi siellä meillä kevätkalaa maistamassa jonakin


päivänä, virkkoi Iisakki lähtien menemään. Vielä lähdettyään hän
vilkaisi Eedlaa, joka siellä puuhaili vieraista välittämättä.

— Pahus, kun tuota Edlaa en ole ennemmin huomannut, pahoitteli


Iisakki. Siinähän se on emäntä Mikkolaan, mitä sitä sen kauempaa…
Kun nyt vaan ei ehtisi joku toinen ennen minua.

Sitä ajatellessa tuli Iisakin käynti kiireisemmäksi ja povessa tuntui


semmoinen outo, hiljainen kaikerrus.

Se asia täytyy ottaa käsille nyt aivan heti. Se on tärkeämpi kuin


osuuskauppa-asia ja kaikki muut kaiken maailman asiat yhteensä.
IV.

Rietula puuhaili myöskin lähtöä osuuskauppakokoukseen. Ylä-


Rietulan isäntä oli ennenkin osottautunut äkäpäiseksi ja kiivaaksi
mieheksi, mutta nyt oli osuuskauppa-asia saanut hänet aivan
raivostumaan. Nytkin karjui hän piioille ja rengeille, ja vanha
emännöitsijä Kustaavakin sai jo ukon mielenpurkauksista osansa.

Rietula oli lautamies ja, kuten sanottu, arka arvostaan myöskin


ulkoasuun nähden. Muutteli nytkin toista paitaa ylleen ja sotkeutui
jotenkuten paitaansa. Kustaavalta pääsi salaa pieni
naurunhytkähdys, mutta isäntä kuuli sen.

— Mitä sinä, akka, hirnut siinä! Lapa tiehes!

Pörröinen tukka ja vihasta pyörivät silmät näkyivät paita-aukosta.


Renki-Villekin alkoi hohottaa nähdessään sen ihmeen, että isäntä
sotkeutui paitaansa.

— Lempojako sinäkin, aikamies, kurnutat, kivahti isäntä ja paita


repesi riekaleiksi hänen käsissään.

— Ovatko ihmiset hulluja, kun nauravat tyhjälle! Minun nuoruuteni


aikana ei naurettu kun kerran tai pari vuodessa, mutta nyt
kurnutetaan lakkaamatta. Ja se on se puoli ihmisessä, jota minä en
kärsi. Minä en ole tyhjälle nauranut, mutta lautamieheksi olen
päässyt ja se on jotain, tiedä se, poika!

Villen poskilihoja nyki, mutta hän puri huultaan. Isännän sanatulva


oli taas ratkennut ja se oli hyvä merkki kokoukseen lähtiessä. Saavat
siellä taas kuulla Rietulan äänen ukkosena jyrisevän ja
huomautuksen siitä, että mies on päässyt lautamieheksi ja rikkaan
talon isännäksi pelkällä sanan voimalla.

— Joko minä valjastan isännälle hevosen? kysyi Ville.

— Sano lautamiehelle, oikaisi Rietula.

— Joko minä sitten lautamiehelle…

— Valjasta vaan ja ota ne kirkkokääsit ja se liinukka.

— Liinukka on ajossa, uskalsi Ville huomauttaa.

— Kuka lempo se on ottanut isännän hevosen! karjasi Rietula.

— Pekkapa tuon näkyi ottavan, totesi poika.

— Pahan hengen nulikka… vai meni tämä ottamaan isännän


hevosen. No, olkoon. Minä menen jalkaisin, mutta sano Pekalle, että
laputtaa tiehensä, ennenkuin minä tulen.

Rietula paiskasi ovea mennessään niin, että rämähti. Pihassa


kuului vielä mennessään jyrisevän piioille, jotka kaivolla pesivät
astioita.

Rietula oli viime päivinä tuntenut omituista pakotusta


sydänalassaan. Hierojakin oli käynyt muokkaamassa, mutta ei tullut
Welcome to our website – the ideal destination for book lovers and
knowledge seekers. With a mission to inspire endlessly, we offer a
vast collection of books, ranging from classic literary works to
specialized publications, self-development books, and children's
literature. Each book is a new journey of discovery, expanding
knowledge and enriching the soul of the reade

Our website is not just a platform for buying books, but a bridge
connecting readers to the timeless values of culture and wisdom. With
an elegant, user-friendly interface and an intelligent search system,
we are committed to providing a quick and convenient shopping
experience. Additionally, our special promotions and home delivery
services ensure that you save time and fully enjoy the joy of reading.

Let us accompany you on the journey of exploring knowledge and


personal growth!

ebookmass.com

You might also like