<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: PETER AMORO</title>
    <description>The latest articles on Forem by PETER AMORO (@peter_amoro_fccf1d029a084).</description>
    <link>https://forem.com/peter_amoro_fccf1d029a084</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3710977%2F3bfe556e-e994-4625-89ec-67c0e364756e.png</url>
      <title>Forem: PETER AMORO</title>
      <link>https://forem.com/peter_amoro_fccf1d029a084</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/peter_amoro_fccf1d029a084"/>
    <language>en</language>
    <item>
      <title>ETL Vs ELT</title>
      <dc:creator>PETER AMORO</dc:creator>
      <pubDate>Mon, 13 Apr 2026 07:22:41 +0000</pubDate>
      <link>https://forem.com/peter_amoro_fccf1d029a084/etl-vs-elt-2hn6</link>
      <guid>https://forem.com/peter_amoro_fccf1d029a084/etl-vs-elt-2hn6</guid>
      <description>&lt;p&gt;&lt;strong&gt;ABSTRACT&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Data engineering has existed in some form since companies started dealing with with data such as predictive analysis, descriptive analytics and reports to give meaningful insight. This article examines the process of sourcing data which is the extraction, the transformation of data which involves the formatting of data into structured dat i.e cleaning data and the loading of data which involves the ingestion, transformation and serving data into the destination like databases. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;INTRODUCTION&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In this article, i will take you through the 2 different processes of the data engineering lifecycles which are mainly &lt;em&gt;ETL&lt;/em&gt; and &lt;em&gt;ELT&lt;/em&gt; and the processes involved in each of them. &lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;ETL (EXTRACTION, TRANSFORMATION, LOADING)&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4bmhbjqyop18uqd6zs1f.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4bmhbjqyop18uqd6zs1f.png" alt="Image showing extraction, loading and transformation" width="800" height="409"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Extraction&lt;/em&gt;: This involves getting data from various sources like APIs, IoT devices (IoT short for Internet of Things — these are devices that collect data through sensors, like the fingerprint scanners on doors that collect fingerprints and store them in a central system), databases, flat files like CSVs, and web scraping. The goal of extraction is simply to pull raw data from wherever it lives and bring it into a staging area — think of it like gathering all your ingredients from the fridge before you start cooking. The data at this stage is messy, unorganized, and not yet ready to be used.&lt;br&gt;
&lt;em&gt;Transformation&lt;/em&gt;: This is the most critical step in ETL. Once the raw data has been extracted, it is processed and cleaned before being loaded into the destination. Transformation can include:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Cleaning&lt;/em&gt; — removing duplicates, fixing typos, handling missing values&lt;br&gt;
&lt;em&gt;Formatting&lt;/em&gt; — converting date formats, standardizing column names, changing data types&lt;br&gt;
&lt;em&gt;Filtering&lt;/em&gt; — removing data that is not relevant to the business use case&lt;br&gt;
&lt;em&gt;Aggregating&lt;/em&gt; — summarizing data, for example calculating total sales per month&lt;br&gt;
&lt;em&gt;Joining&lt;/em&gt; — combining data from multiple sources into one unified dataset&lt;/p&gt;

&lt;p&gt;This transformation happens in an intermediate processing layer or staging environment, outside the final destination database.&lt;br&gt;
Loading: After the data has been cleaned and transformed, it is loaded into the destination — usually a data warehouse like Amazon Redshift, Google BigQuery, or Snowflake. Because the data is already clean and structured at this point, it is immediately ready for analysts and business intelligence tools to query and use.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ELT (EXTRACTION, LOADING, TRANSFORMATION)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc9kdhkimgnw6epzkazap.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc9kdhkimgnw6epzkazap.png" alt="Image showing extraction, transformation and loading" width="800" height="409"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;ELT follows the same three steps as ETL but in a different order — the transformation happens after the data has already been loaded into the destination.&lt;br&gt;
Extraction: Same as in ETL — raw data is pulled from various sources such as APIs, databases, IoT devices, and flat files.&lt;br&gt;
Loading: The raw, unprocessed data is loaded directly into the destination — typically a modern cloud data warehouse. These modern warehouses are powerful enough to store and process huge volumes of raw data without needing it to be cleaned first.&lt;br&gt;
Transformation: Once the raw data is sitting inside the data warehouse, transformations are performed there using tools like dbt (data build tool). This approach takes advantage of the processing power of the warehouse itself rather than relying on a separate transformation layer.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Which One Should You Use?&lt;/em&gt;&lt;/strong&gt;&lt;br&gt;
The answer depends on your use case:&lt;/p&gt;

&lt;p&gt;Use ETL when you are dealing with sensitive data that must be cleaned and masked before it enters your system, or when working with older, on-premise databases that cannot handle raw data at scale.&lt;br&gt;
Use ELT when you are working with large volumes of data, using a modern cloud data warehouse, and need flexibility to transform data in multiple ways for different teams.&lt;/p&gt;

&lt;p&gt;In modern data engineering, ELT has become the more popular approach because cloud warehouses have become powerful and affordable enough to handle transformations internally, making the process faster and more flexible.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;CONCLUSION&lt;/em&gt;&lt;/strong&gt;&lt;br&gt;
Both ETL and ELT are fundamental processes in the data engineering lifecycle. They both serve the same ultimate goal — getting clean, reliable data into the hands of the people who need it. The key difference lies in where and when the transformation happens. As a beginner in data engineering, understanding these two processes gives you a solid foundation for working with data pipelines, warehouses, and analytics workflows.&lt;/p&gt;

</description>
      <category>etl</category>
      <category>elt</category>
    </item>
    <item>
      <title>--- title: Understanding SQL Joins and Window Functions published: false tags: sql, database, programming, beginners ---</title>
      <dc:creator>PETER AMORO</dc:creator>
      <pubDate>Wed, 08 Apr 2026 13:19:24 +0000</pubDate>
      <link>https://forem.com/peter_amoro_fccf1d029a084/-title-understanding-sql-joins-and-window-functions-published-false-tags-sql-database-3d7a</link>
      <guid>https://forem.com/peter_amoro_fccf1d029a084/-title-understanding-sql-joins-and-window-functions-published-false-tags-sql-database-3d7a</guid>
      <description>&lt;h1&gt;
  
  
  Understanding SQL Joins and Window Functions
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Abstract
&lt;/h2&gt;

&lt;p&gt;Relational databases store data across multiple tables to maintain organization and reduce redundancy. Retrieving meaningful insights from these tables often requires combining data and performing analytical operations. Two powerful SQL features that help accomplish this are &lt;strong&gt;joins&lt;/strong&gt; and &lt;strong&gt;window functions&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Joins allow developers to combine data from different tables based on relationships between columns. Window functions, on the other hand, enable advanced calculations across sets of rows without collapsing the dataset into grouped results. This article introduces the key concepts behind SQL joins and window functions and demonstrates how they can be used in real-world queries.&lt;/p&gt;




&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;Structured Query Language (SQL) is the standard language used to interact with relational databases. In most real-world systems, data is not stored in a single table but distributed across multiple related tables.&lt;/p&gt;

&lt;p&gt;For example, employee information might exist in one table while department information exists in another. To analyze this data effectively, developers must combine related tables and perform calculations across multiple rows.&lt;/p&gt;

&lt;p&gt;SQL provides two powerful mechanisms for this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Joins&lt;/strong&gt;, which allow data from multiple tables to be combined.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Window functions&lt;/strong&gt;, which allow analytical calculations while keeping the original dataset intact.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Understanding these features is essential for writing efficient SQL queries and performing advanced data analysis.&lt;/p&gt;




&lt;h2&gt;
  
  
  SQL Joins
&lt;/h2&gt;

&lt;p&gt;A &lt;strong&gt;join&lt;/strong&gt; is used to combine rows from two or more tables based on a related column.&lt;/p&gt;

&lt;p&gt;Joins are commonly used when information is stored across different tables but needs to be viewed or analyzed together.&lt;/p&gt;

&lt;h3&gt;
  
  
  INNER JOIN
&lt;/h3&gt;

&lt;p&gt;An &lt;strong&gt;INNER JOIN&lt;/strong&gt; returns only the rows where matching values exist in both tables.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;employees&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;departments&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;department_name&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;employees&lt;/span&gt;
&lt;span class="k"&gt;INNER&lt;/span&gt; &lt;span class="k"&gt;JOIN&lt;/span&gt; &lt;span class="n"&gt;departments&lt;/span&gt;
&lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;employees&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;department_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;departments&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;department_id&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In this query, only employees whose department IDs match entries in the departments table will appear in the result.&lt;/p&gt;




&lt;h3&gt;
  
  
  LEFT JOIN
&lt;/h3&gt;

&lt;p&gt;A &lt;strong&gt;LEFT JOIN&lt;/strong&gt; returns all rows from the left table and the matching rows from the right table. If no match exists, the result will contain &lt;code&gt;NULL&lt;/code&gt; values.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;employees&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;departments&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;department_name&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;employees&lt;/span&gt;
&lt;span class="k"&gt;LEFT&lt;/span&gt; &lt;span class="k"&gt;JOIN&lt;/span&gt; &lt;span class="n"&gt;departments&lt;/span&gt;
&lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;employees&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;department_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;departments&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;department_id&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This type of join is useful when you want to ensure that all records from the main table are included, even if related data is missing.&lt;/p&gt;




&lt;h3&gt;
  
  
  RIGHT JOIN
&lt;/h3&gt;

&lt;p&gt;A &lt;strong&gt;RIGHT JOIN&lt;/strong&gt; returns all rows from the right table and the matching rows from the left table.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;employees&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;departments&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;department_name&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;employees&lt;/span&gt;
&lt;span class="k"&gt;RIGHT&lt;/span&gt; &lt;span class="k"&gt;JOIN&lt;/span&gt; &lt;span class="n"&gt;departments&lt;/span&gt;
&lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;employees&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;department_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;departments&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;department_id&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This ensures that all records from the right table appear in the result.&lt;/p&gt;




&lt;h3&gt;
  
  
  FULL JOIN
&lt;/h3&gt;

&lt;p&gt;A &lt;strong&gt;FULL JOIN&lt;/strong&gt; returns all rows from both tables. When no match exists between rows, the missing values are represented as &lt;code&gt;NULL&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;employees&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;departments&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;department_name&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;employees&lt;/span&gt;
&lt;span class="k"&gt;FULL&lt;/span&gt; &lt;span class="k"&gt;JOIN&lt;/span&gt; &lt;span class="n"&gt;departments&lt;/span&gt;
&lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;employees&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;department_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;departments&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;department_id&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This join is useful when you want to view all available records from both tables.&lt;/p&gt;




&lt;h2&gt;
  
  
  SQL Window Functions
&lt;/h2&gt;

&lt;p&gt;While joins allow us to combine tables, &lt;strong&gt;window functions allow us to perform calculations across rows without grouping the data into a single result.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Unlike &lt;code&gt;GROUP BY&lt;/code&gt;, which aggregates rows into one output per group, window functions maintain the original rows while adding calculated values.&lt;/p&gt;

&lt;p&gt;The general syntax for a window function is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="n"&gt;function_name&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="n"&gt;OVER&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;PARTITION&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="k"&gt;column&lt;/span&gt; &lt;span class="k"&gt;ORDER&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="k"&gt;column&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  Ranking Example
&lt;/h3&gt;

&lt;p&gt;Window functions are often used to rank data. The &lt;code&gt;RANK()&lt;/code&gt; function assigns a rank to each row based on a specified order.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt;
&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="n"&gt;salary&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="n"&gt;RANK&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="n"&gt;OVER&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;ORDER&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;salary&lt;/span&gt; &lt;span class="k"&gt;DESC&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;salary_rank&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;employees&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F59b9hr784s676oz8vjtd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F59b9hr784s676oz8vjtd.png" alt=" " width="800" height="182"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This query ranks employees based on their salary from highest to lowest.&lt;/p&gt;




&lt;h3&gt;
  
  
  Using PARTITION BY
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;PARTITION BY&lt;/code&gt; divides rows into groups and applies the window function separately within each group.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt;
&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="n"&gt;department_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="n"&gt;salary&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="n"&gt;RANK&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="n"&gt;OVER&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
&lt;span class="k"&gt;PARTITION&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;department_id&lt;/span&gt;
&lt;span class="k"&gt;ORDER&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;salary&lt;/span&gt; &lt;span class="k"&gt;DESC&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;department_rank&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;employees&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In this example, employees are ranked within their own departments rather than across the entire table.&lt;/p&gt;




&lt;h3&gt;
  
  
  Running Totals
&lt;/h3&gt;

&lt;p&gt;Window functions can also calculate cumulative values, such as running totals.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt;
&lt;span class="n"&gt;employee_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="n"&gt;salary&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="k"&gt;SUM&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;salary&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;OVER&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;ORDER&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;employee_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;running_total&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;employees&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This query calculates a running total of salaries as the rows progress.&lt;/p&gt;




&lt;h2&gt;
  
  
  Discussion
&lt;/h2&gt;

&lt;p&gt;Both joins and window functions are widely used in real-world database systems. Joins enable developers to retrieve related data from multiple tables, which is essential for reporting and application development.&lt;/p&gt;

&lt;p&gt;Window functions provide powerful analytical capabilities that allow developers and analysts to perform calculations such as ranking, running totals, and comparisons without losing row-level detail.&lt;/p&gt;

&lt;p&gt;Together, these SQL features make it possible to build complex queries that provide deeper insights into structured datasets.&lt;/p&gt;




&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;SQL joins and window functions are essential tools for working with relational databases. Joins allow data from multiple tables to be combined based on relationships, while window functions enable advanced analytical calculations across rows.&lt;/p&gt;

&lt;p&gt;By understanding and applying these concepts, developers and data professionals can write more efficient queries and unlock meaningful insights from their data.&lt;/p&gt;

</description>
      <category>sql</category>
      <category>database</category>
      <category>programming</category>
    </item>
    <item>
      <title>How Analysts Translate Messy Data, DAX, and Dashboards into Action Using Power BI: A Case Study of Kenya Crop Data</title>
      <dc:creator>PETER AMORO</dc:creator>
      <pubDate>Mon, 09 Feb 2026 13:58:49 +0000</pubDate>
      <link>https://forem.com/peter_amoro_fccf1d029a084/how-analysts-translate-messy-data-dax-and-dashboards-into-action-using-power-bi-a-case-study-of-59n4</link>
      <guid>https://forem.com/peter_amoro_fccf1d029a084/how-analysts-translate-messy-data-dax-and-dashboards-into-action-using-power-bi-a-case-study-of-59n4</guid>
      <description>&lt;h2&gt;
  
  
  Abstract
&lt;/h2&gt;

&lt;p&gt;Data-driven decision-making depends on the ability to transform raw, unstructured data into meaningful insights. In practice, datasets are often messy, incomplete, and difficult to interpret without proper analytical tools. This article examines how analysts use Power BI to translate messy agricultural data into actionable insights, using a Kenya crops dataset as a case study. Through data cleaning, modeling, DAX calculations, and dashboard design, Power BI enables analysts to convert complex datasets into interactive visual reports that support informed decision-making in agriculture and policy planning.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. Introduction
&lt;/h2&gt;

&lt;p&gt;Modern data analysis goes beyond collecting information; it focuses on extracting insights that can guide action. In sectors such as agriculture, where data influences food security, economic planning, and sustainability, accurate analysis is especially critical. However, agricultural datasets are often inconsistent, poorly structured, and difficult to analyze in their raw form.&lt;/p&gt;

&lt;p&gt;During practical training with Power BI, a Kenya crops dataset was used to demonstrate how analysts transform messy data into meaningful dashboards. This article explores the analytical process, highlighting the role of data cleaning, DAX (Data Analysis Expressions), and visualization in converting raw agricultural data into actionable insights.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. Methodology
&lt;/h2&gt;

&lt;p&gt;This is the raw Kenya Crop Data as an excel spreadsheet before its loaded into the Power BI&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frp3fe7rj618iax6m6nd2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frp3fe7rj618iax6m6nd2.png" alt=" " width="800" height="399"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  2.1 Data Preparation
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F514446d6ly9ef9oqus1c.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F514446d6ly9ef9oqus1c.png" alt=" " width="800" height="499"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The initial dataset contained information on crop types, production levels, regions, and time periods in Kenya. Before analysis, the data required cleaning and transformation. Power Query in Power BI was used to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Remove duplicate and missing records &lt;/li&gt;
&lt;li&gt;Standardize crop and region names
&lt;/li&gt;
&lt;li&gt;Rename columns for clarity
&lt;/li&gt;
&lt;li&gt;Ensure numerical fields were correctly formatted
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These steps ensured data consistency and reliability, forming a strong foundation for further analysis.&lt;/p&gt;




&lt;h3&gt;
  
  
  2.2 Data Modeling and DAX
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzssi2sdj1llnducfgvtw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzssi2sdj1llnducfgvtw.png" alt=" " width="800" height="506"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After cleaning, the dataset was modeled within Power BI to support analytical calculations. DAX was used to create measures such as:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fusyf7ygwvs552dc3h5rt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fusyf7ygwvs552dc3h5rt.png" alt=" " width="800" height="157"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Total Cost of crop production by region &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgbbowzc4ptua1nqn1gyw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgbbowzc4ptua1nqn1gyw.png" alt=" " width="800" height="29"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Total Profit&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiaf27kki001nax335tvr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiaf27kki001nax335tvr.png" alt=" " width="644" height="36"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Total Revenue&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqjhk2hzzluwl894teo9c.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqjhk2hzzluwl894teo9c.png" alt=" " width="587" height="35"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;-Total Yield&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz0prggh3uelz768thas5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz0prggh3uelz768thas5.png" alt=" " width="541" height="44"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;DAX enabled dynamic calculations that adjusted automatically when filters and slicers were applied, allowing deeper exploration of the data.&lt;/p&gt;




&lt;h3&gt;
  
  
  2.3 Dashboard Development
&lt;/h3&gt;

&lt;p&gt;Interactive dashboards were designed to present insights visually. Bar charts, line charts, and geographic maps were used to display trends, regional comparisons, and crop distributions. Slicers allowed users to filter data by crop type, region, or year, making the dashboard accessible to both technical and non-technical users.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1c8sl9vruq2tibswwoky.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1c8sl9vruq2tibswwoky.png" alt=" " width="800" height="525"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  3. Discussion
&lt;/h2&gt;

&lt;p&gt;The Kenya crops Power BI dashboard demonstrated how structured analysis turns raw data into insight. Patterns in crop production across regions became immediately visible, enabling comparison and trend identification. Analysts could quickly identify high-performing regions, declining production trends, or dominant crops.&lt;/p&gt;

&lt;p&gt;This process highlights the analyst’s role as a translator between data and decision-makers. Rather than presenting raw tables, analysts use DAX and dashboards to communicate insights clearly and efficiently. In agriculture, such insights can inform policy decisions, resource allocation, and long-term planning.&lt;/p&gt;




&lt;h2&gt;
  
  
  4. Conclusion
&lt;/h2&gt;

&lt;p&gt;Power BI provides analysts with the tools needed to transform messy datasets into actionable intelligence. Through careful data preparation, logical DAX calculations, and effective dashboard design, raw agricultural data can be converted into meaningful insights.&lt;/p&gt;

&lt;p&gt;The Kenya crops dataset demonstrated how Power BI supports data-driven decision-making in agriculture. By translating complex data into clear visuals and metrics, analysts enable stakeholders to make informed decisions that impact food security, economic development, and sustainability. Ultimately, the value of Power BI lies not in visualization alone, but in its ability to bridge the gap between data and action.&lt;/p&gt;




</description>
      <category>powerbi</category>
      <category>data</category>
      <category>datascience</category>
    </item>
    <item>
      <title>Getting Started with Linux for Data Engineers: Working with Servers, Permissions and Nano Editor.</title>
      <dc:creator>PETER AMORO</dc:creator>
      <pubDate>Mon, 26 Jan 2026 07:17:07 +0000</pubDate>
      <link>https://forem.com/peter_amoro_fccf1d029a084/an-introduction-to-linux-for-data-engineers-using-the-nano-editor-with-practical-examples-39a2</link>
      <guid>https://forem.com/peter_amoro_fccf1d029a084/an-introduction-to-linux-for-data-engineers-using-the-nano-editor-with-practical-examples-39a2</guid>
      <description>&lt;h2&gt;
  
  
  Abstract
&lt;/h2&gt;

&lt;p&gt;In class i learnt that Linux is the dominant operating system in modern data engineering environments. Most data pipelines, databases and cloud-based data platforms are deployed on Linux servers. This article introduces fundamental Linux concepts for data engineers, presents essential Linux commands in the order they are typically used, and demonstrates how the &lt;strong&gt;nano&lt;/strong&gt; text editor can be applied in practical data engineering tasks.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. Introduction
&lt;/h2&gt;

&lt;p&gt;Data engineering involves building, maintaining, and optimizing data pipelines that operate in production environments. Linux plays a central role in this ecosystem due to its stability, performance, and extensive command-line tooling. As a result, data engineers are expected to interact with Linux systems directly through the terminal.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. Why Data Engineers Use Linux
&lt;/h2&gt;

&lt;p&gt;Linux is widely used in data engineering for several reasons:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Most databases and distributed data platforms are optimized for Linux&lt;/li&gt;
&lt;li&gt;Powerful command-line tools enable efficient automation&lt;/li&gt;
&lt;li&gt;Remote access simplifies server and cloud infrastructure management&lt;/li&gt;
&lt;li&gt;Strong support for scripting and scheduling data pipelines&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Because of these advantages, Linux proficiency is considered a foundational skill for data engineers.&lt;/p&gt;




&lt;h3&gt;
  
  
  3. Server Access Using SSH
&lt;/h3&gt;

&lt;p&gt;In real-world environments, data engineers access servers remotely using &lt;strong&gt;SSH (Secure Shell)&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fobhl0hcfsbgjj3181zr2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fobhl0hcfsbgjj3181zr2.png" alt=" " width="800" height="254"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  While logged in as root, create a new user:
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1fj0rc4pg23pvtu5cwv7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1fj0rc4pg23pvtu5cwv7.png" alt=" " width="800" height="249"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Switch from the root user to the newly created user:
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhtol2hh0t7ax76a198du.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhtol2hh0t7ax76a198du.png" alt=" " width="800" height="102"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Confirm the active user and working directory:
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr4kr60uql1821lxl7rm1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr4kr60uql1821lxl7rm1.png" alt=" " width="659" height="183"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  In order to create directories i make my user account a super user
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgbsffa26q5txexs0q7f2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgbsffa26q5txexs0q7f2.png" alt=" " width="737" height="33"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Verify the user is now sudo-enabled
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flzx7wncbtdygomzcdbfl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flzx7wncbtdygomzcdbfl.png" alt=" " width="800" height="103"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Essential Linux Commands in a Typical Workflow
&lt;/h2&gt;

&lt;p&gt;Linux commands are usually executed in a logical sequence during real-world data engineering tasks. The commands below are ordered according to a typical workflow.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Checking the Current Directory
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fni4ufjxk1zuus0psxhu4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fni4ufjxk1zuus0psxhu4.png" alt=" " width="645" height="104"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  creating directories or folders
&lt;/h3&gt;

&lt;p&gt;A directory for organizing project files is created using mkdir:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F57mcyf6mo2eniguja5xl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F57mcyf6mo2eniguja5xl.png" alt=" " width="636" height="27"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Listing Files and Directories
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fett6udidbeudtb4rtwpi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fett6udidbeudtb4rtwpi.png" alt=" " width="624" height="51"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Navigating into the Directory
&lt;/h3&gt;

&lt;p&gt;The newly created directory is accessed using:&lt;/p&gt;

&lt;p&gt;cd example&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9qdcxdv7ojqezpco244n.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9qdcxdv7ojqezpco244n.png" alt=" " width="745" height="58"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Creating Files
&lt;/h3&gt;

&lt;p&gt;An empty file is created using:&lt;/p&gt;

&lt;p&gt;touch etl.py&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fic2vboxvzqzkdi95st6k.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fic2vboxvzqzkdi95st6k.png" alt=" " width="746" height="29"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Downloading Data
&lt;/h3&gt;

&lt;p&gt;A dataset is downloaded from the internet using:&lt;/p&gt;

&lt;p&gt;wget &lt;a href="https://raw.githubusercontent.com/mwaskom/seaborn-data/master/iris.csv" rel="noopener noreferrer"&gt;https://raw.githubusercontent.com/mwaskom/seaborn-data/master/iris.csv&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpjb5f4ovbpqonkzmg1pf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpjb5f4ovbpqonkzmg1pf.png" alt=" " width="800" height="253"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Viewing File Contents
&lt;/h3&gt;

&lt;p&gt;The contents of a file are displayed using:&lt;/p&gt;

&lt;p&gt;cat iris.csv&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjur97ymx4cre7dib4091.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjur97ymx4cre7dib4091.png" alt=" " width="800" height="143"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Viewing Large Files
&lt;/h3&gt;

&lt;p&gt;Large files are viewed page by page using:&lt;/p&gt;

&lt;p&gt;more iris.csv&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm0tyqysmotzg8vrkithc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm0tyqysmotzg8vrkithc.png" alt=" " width="800" height="199"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Previewing File Data
&lt;/h3&gt;

&lt;p&gt;The first and last lines of a file are viewed using:&lt;/p&gt;

&lt;p&gt;head iris.csv &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuxqo4qpbib1hcg9a3fa2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuxqo4qpbib1hcg9a3fa2.png" alt=" " width="800" height="282"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;tail iris.csv&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjazxee4fuxmiiquqyndc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjazxee4fuxmiiquqyndc.png" alt=" " width="779" height="290"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Searching Within Files
&lt;/h3&gt;

&lt;p&gt;Specific patterns within files are searched using:&lt;/p&gt;

&lt;p&gt;grep petal_width iris.csv&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc6g1eo1810vkx7936dqc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc6g1eo1810vkx7936dqc.png" alt=" " width="800" height="54"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Appending Output to a File
&lt;/h3&gt;

&lt;p&gt;Text is appended to a file using output redirection:&lt;/p&gt;

&lt;p&gt;echo ETL job completed successfully &amp;gt;&amp;gt; iris.csv&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frgh7q2lejce2c2wj0cvp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frgh7q2lejce2c2wj0cvp.png" alt=" " width="800" height="73"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Using the Nano Editor
&lt;/h2&gt;

&lt;p&gt;Nano is a lightweight and beginner-friendly text editor available on most Linux systems. It allows users to edit files directly from the terminal without requiring complex commands or modes.&lt;/p&gt;

&lt;h3&gt;
  
  
  Opening a File with Nano
&lt;/h3&gt;

&lt;p&gt;Files such as Python scripts, SQL files, or configuration files are opened using:&lt;/p&gt;

&lt;p&gt;nano iris.csv&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzczisrxt5xqh1chi1c9m.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzczisrxt5xqh1chi1c9m.png" alt=" " width="800" height="214"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Saving and Exiting Nano
&lt;/h3&gt;

&lt;p&gt;Changes are saved using the appropriate nano shortcut, and the editor is exited safely after editing is complete. Nano displays all available shortcuts at the bottom of the screen, making it easy to use for beginners.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fahmamq4rsebmlt13bq58.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fahmamq4rsebmlt13bq58.png" alt=" " width="800" height="96"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  7. Conclusion
&lt;/h2&gt;

&lt;p&gt;This assignment demonstrates foundational Linux skills required for data engineering tasks. By securely accessing a remote server using SSH, managing user accounts, organizing files with Linux commands, and editing scripts using the nano editor, data engineers gain practical experience working in real-world Linux environments. Mastery of these skills provides a strong foundation for working with production data systems.&lt;/p&gt;




</description>
      <category>linux</category>
      <category>dataengineering</category>
      <category>nanoeditor</category>
      <category>luxdevhq</category>
    </item>
    <item>
      <title>Learning Git &amp; GitHub as a Data Engineering Student at LuxDevHQ</title>
      <dc:creator>PETER AMORO</dc:creator>
      <pubDate>Sat, 17 Jan 2026 15:12:26 +0000</pubDate>
      <link>https://forem.com/peter_amoro_fccf1d029a084/learning-git-github-as-a-data-engineering-student-at-luxdevhq-4co2</link>
      <guid>https://forem.com/peter_amoro_fccf1d029a084/learning-git-github-as-a-data-engineering-student-at-luxdevhq-4co2</guid>
      <description>&lt;p&gt;As a student who recently started learning &lt;strong&gt;Data Engineering&lt;/strong&gt;, one of the first tools we were introduced to was &lt;strong&gt;Git and GitHub&lt;/strong&gt; it is one of the most important tools for anyone working with code and data and planning to collaborate with my fellow students at LuxDevHQ&lt;/p&gt;

&lt;p&gt;This article explains in a simple way:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;What Git and GitHub are&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;How to set up Git Bash&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;How to connect Git to GitHub&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;How to push and pull code&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;How version control works&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;What is Git?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Git&lt;/strong&gt; is a &lt;strong&gt;version control system&lt;/strong&gt;.&lt;br&gt;&lt;br&gt;
It helps you keep track of every change you make to your files and keep track of each version of your code.&lt;/p&gt;

&lt;p&gt;This is very important in &lt;strong&gt;Data Engineering&lt;/strong&gt; because we:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Experiment with data
&lt;/li&gt;
&lt;li&gt;Change code often
&lt;/li&gt;
&lt;li&gt;Work on long projects
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Git makes sure nothing gets lost.&lt;/p&gt;


&lt;h2&gt;
  
  
  &lt;strong&gt;What is GitHub?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;GitHub&lt;/strong&gt; is a website where Git projects are stored online.&lt;/p&gt;

&lt;p&gt;It allows you to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Back up your work
&lt;/li&gt;
&lt;li&gt;Share your projects
&lt;/li&gt;
&lt;li&gt;Work with other people
&lt;/li&gt;
&lt;li&gt;Show your work to employers
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Git works on your computer.&lt;br&gt;&lt;br&gt;
GitHub stores your Git projects on the internet.&lt;/p&gt;


&lt;h2&gt;
  
  
  &lt;strong&gt;Installing Git Bash&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;For my case, i use a macbook so i dont install Git Bash natively so i install git via the terminal.&lt;/p&gt;
&lt;h3&gt;
  
  
  &lt;strong&gt;On macOS&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Open Terminal and type&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git &lt;span class="nt"&gt;--version&lt;/span&gt;



&lt;span class="o"&gt;![&lt;/span&gt; &lt;span class="o"&gt;](&lt;/span&gt;https://dev-to-uploads.s3.amazonaws.com/uploads/articles/sjljwj0u29l9t7jhenq8.png&lt;span class="o"&gt;)&lt;/span&gt;



&lt;span class="c"&gt;# Connecting to a GitHub Account&lt;/span&gt;

&lt;span class="c"&gt;## Step 1: Login or Create a GitHub account., since i have an account i just login &lt;/span&gt;



&lt;span class="c"&gt;## Step 2: Configure Git with your details&lt;/span&gt;

Run the following commands:

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;br&gt;
bash&lt;br&gt;
git config --global user.name "Your Name"&lt;br&gt;
git config --global user.email "&lt;a href="mailto:youremail@example.com"&gt;youremail@example.com&lt;/a&gt;"&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
Confirm the setup:

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;br&gt;
bash&lt;br&gt;
git config --list&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
![ ](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/oisj0pdxrst6raqbw6zp.png)


# Connecting Git to GitHub Using SSH

Using **SSH** allows you to push and pull code **without entering your password every time**.

## Generate an SSH key

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;br&gt;
bash&lt;br&gt;
ssh-keygen -t ed25519 -C "&lt;a href="mailto:youremail@example.com"&gt;youremail@example.com&lt;/a&gt;"&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
Press **Enter** for all prompts.

## Start the SSH agent and add the key

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;br&gt;
bash&lt;br&gt;
eval "$(ssh-agent -s)"&lt;br&gt;
ssh-add ~/.ssh/id_ed25519&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
## Copy the SSH key

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;br&gt;
bash&lt;br&gt;
pbcopy &amp;lt; ~/.ssh/id_ed25519.pub&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
## Add the SSH key to GitHub

1. Go to **GitHub Settings**
2. Select **SSH and GPG keys**
3. Click **New SSH key**
4. Paste the key and save

Test the connection:

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;br&gt;
bash&lt;br&gt;
ssh -T &lt;a href="mailto:git@github.com"&gt;git@github.com&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
A success message confirms the connection.

![ ](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/fk86o2r75v3b6cizf9db.png)


# Understanding Version Control

**Version control** is a system that:

* Tracks **file changes**
* Saves a **history of your project**
* Allows you to **restore previous versions**
* Enables **safe collaboration**

Git works like a **timeline**, recording every meaningful change.

# Creating a Local Git Repository

## Create a project folder

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;br&gt;
bash&lt;br&gt;
mkdir luxDev&lt;br&gt;
cd luxdev&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;



## Initialize Git

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;br&gt;
bash&lt;br&gt;
git init&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;![ ](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/j7iait5xdeax62en3tbo.png)

Git now tracks this folder.

# Tracking Changes with Git

## Check file status

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;br&gt;
bash&lt;br&gt;
git status&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
![ ](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ibpj5heslws8dfe5rzol.png)



## Add files to the staging area

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;br&gt;
bash&lt;br&gt;
git add .&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
## Commit changes

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;br&gt;
bash&lt;br&gt;
git commit -m "Initial commit"&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
A **commit** is a saved snapshot of your project.

# Pushing Code to GitHub

## Create a repository on GitHub

* Click **New Repository**
* Do **not** add a README file
* Copy the **SSH repository link**

![ ](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/fb673jj5ont71p5lhrsi.png)


## Connect the local project to GitHub

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;br&gt;
bash&lt;br&gt;
git remote add origin &lt;a href="mailto:git@github.com"&gt;git@github.com&lt;/a&gt;:username/repository-name.git&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
## Push code to GitHub

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;br&gt;
bash&lt;br&gt;
git branch -M main&lt;br&gt;
git push -u origin main&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
Your code is now available on **GitHub**.

# Pulling Code from GitHub

To download updates from GitHub:

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;br&gt;
bash&lt;br&gt;
git pull origin main&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
This is useful when:

* Working on **multiple devices**
* Collaborating with **other developers**
* Updating **shared projects**

# Viewing Project History

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;br&gt;
bash&lt;br&gt;
git log&lt;/p&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;


This command shows **previous commits**, authors, and dates.




&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

</description>
      <category>beginners</category>
      <category>dataengineering</category>
      <category>git</category>
      <category>github</category>
    </item>
  </channel>
</rss>
