<?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>DEV Community: Abdi Omari</title>
    <description>The latest articles on DEV Community by Abdi Omari (@abdiomari).</description>
    <link>https://dev.to/abdiomari</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%2F992095%2F41ae8bc1-3d6c-46f0-9e44-7e098ae1f08d.jpeg</url>
      <title>DEV Community: Abdi Omari</title>
      <link>https://dev.to/abdiomari</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/abdiomari"/>
    <language>en</language>
    <item>
      <title>Uploading Dashboards to the Web: A Beginner's Guide</title>
      <dc:creator>Abdi Omari</dc:creator>
      <pubDate>Tue, 07 Apr 2026 11:51:14 +0000</pubDate>
      <link>https://dev.to/abdiomari/uploading-dashboards-to-the-web-a-beginners-guide-2p8n</link>
      <guid>https://dev.to/abdiomari/uploading-dashboards-to-the-web-a-beginners-guide-2p8n</guid>
      <description>&lt;p&gt;Your Power BI report looks great on your desktop and your boss just asked you to share the report. His laptop does not have Power BI installed, He also wants to see his report changing and adjust values during his next presentation so your pdf won't do. &lt;/p&gt;

&lt;p&gt;This is a classic case that Power BI solves by creating interactive and shareable reports that will leave your boss impressed. &lt;/p&gt;

&lt;p&gt;Power BI is a Microsoft Business Intelligence tool used by data analysts to clean, organise and analyse large datasets and present findings in interactive dashboards and reports.&lt;/p&gt;

&lt;p&gt;In this Article we will explore how to create an organisations workspace for specific reports, how to publish to the workspace and embedding the Reports. &lt;/p&gt;

&lt;p&gt;Step 1: Creating a Workspace&lt;/p&gt;

&lt;p&gt;Why it Matters: A workspace is your report's home, it is where you manage, share and control access to specific reports.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Log into Power BI Service&lt;/li&gt;
&lt;li&gt;Click Workspaces -&amp;gt; Create a workspace&lt;/li&gt;
&lt;li&gt;Choose a meaningful name and Description(Optional)&lt;/li&gt;
&lt;/ol&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%2Fgdmsj7vp1o3y50uuf2oz.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%2Fgdmsj7vp1o3y50uuf2oz.png" alt=" " width="800" height="430"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Click on Create&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Step 2: Uploading and Publishing your Report&lt;/p&gt;

&lt;p&gt;Why it matters: This moves your report from your local machine into the cloud, making it accessible and shareable.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;In Power BI Desktop go to Home -&amp;gt; Publish &lt;/li&gt;
&lt;li&gt;Sign in with your Microsoft account if prompted&lt;/li&gt;
&lt;li&gt;Select the workspace you created&lt;/li&gt;
&lt;/ol&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%2Fhuha97swme7ne6ci61fw.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%2Fhuha97swme7ne6ci61fw.png" alt=" " width="502" height="246"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Once done click the link to open the report in power bi service&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Step 3: Generating the Embed Code&lt;br&gt;
Why it matters: The embed code helps you to display PowerBi on a website. it is a snippet of a HTML file that renders a live, interactive report in any webpage. &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open the Published report in Power BI service&lt;/li&gt;
&lt;li&gt;Click File -&amp;gt; Embed report -&amp;gt; Website or Portal &lt;/li&gt;
&lt;/ol&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%2Fvbcso1rmvwp14wojf54l.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%2Fvbcso1rmvwp14wojf54l.png" alt=" " width="800" height="430"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;A dialog appears with an  snippet and a link. Copy the entire code.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This will display your dashboard publicly so remember to double check for sensitive information about the organisation.&lt;/p&gt;

&lt;p&gt;Step 4: Embedding the Report on a Webiste&lt;/p&gt;

&lt;p&gt;Why it Matters: This is where the report goes live. &lt;br&gt;
Paste the  into your HTML where you want the report to appear as such &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%2Frsb9lrhwbl600rz1s6yg.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%2Frsb9lrhwbl600rz1s6yg.png" alt=" " width="730" height="384"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can then use free hosting services to deploy your html page online. If you have a live website you can also publish to the website. &lt;/p&gt;

&lt;p&gt;That's it &lt;br&gt;
You have successfuly impressed your boss by creating a live, interactive report and embedded it directly in the organisation website. It can update automatically as the underlying data changes.&lt;/p&gt;

</description>
      <category>powerfuldevs</category>
      <category>data</category>
      <category>dataengineering</category>
    </item>
    <item>
      <title>Understanding Data Modeling in Power BI</title>
      <dc:creator>Abdi Omari</dc:creator>
      <pubDate>Mon, 30 Mar 2026 09:22:28 +0000</pubDate>
      <link>https://dev.to/abdiomari/understanding-data-modeling-in-power-bi-3cde</link>
      <guid>https://dev.to/abdiomari/understanding-data-modeling-in-power-bi-3cde</guid>
      <description>&lt;p&gt;Data modeling is the invisible foundation underneath every Power BI report. Get it right, and your visuals are fast, accurate, and easy to maintain. Get it wrong, and you spend hours debugging numbers that don't add up and reports that take three minutes to load.&lt;/p&gt;

&lt;p&gt;This article is a complete guide to data modeling in Power BI. By the end, you will understand:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What data modeling is and why it matters&lt;/li&gt;
&lt;li&gt;All six SQL join types — with examples and diagrams&lt;/li&gt;
&lt;li&gt;The difference between joins and Power BI relationships&lt;/li&gt;
&lt;li&gt;Every relationship property: cardinality, cross-filter direction, active vs inactive&lt;/li&gt;
&lt;li&gt;Fact tables, dimension tables, and why the distinction matters&lt;/li&gt;
&lt;li&gt;Star, Snowflake, and Flat Table schemas — with real use cases&lt;/li&gt;
&lt;li&gt;Role-playing dimensions&lt;/li&gt;
&lt;li&gt;The most common modeling mistakes and how to fix them&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Dataset used in this article is a basic excel file for a small retailer with only 5 tables.Feel free to download and follow along.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://docs.google.com/spreadsheets/d/1CcTL53tV1op7gprpS9hqSnS3S1vV_WyA/edit?usp=sharing&amp;amp;ouid=111654635610101094218&amp;amp;rtpof=true&amp;amp;sd=true" rel="noopener noreferrer"&gt;link to drive&lt;/a&gt;&lt;br&gt;
&lt;a href="https://github.com/abdiomari/Data-Engineering-/tree/master/Data%20Modelling%20with%20Power%20BI" rel="noopener noreferrer"&gt;link to github&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Section 1 - What is Data Modeling?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Data Modeling&lt;/strong&gt; is the process of organising tables and defining how they relate to each other so that an analysis tool like powerbi can correctly combine data in reports.&lt;/p&gt;

&lt;p&gt;In Power BI, data modeling happens in three places:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Power Query (Query Editor)&lt;/strong&gt; — where you clean, transform, and sometimes physically combine tables using joins before loading them into the model.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Model View&lt;/strong&gt; — where you define logical relationships between tables using the drag-and-drop relationship diagram.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DAX (Data Analysis Expressions)&lt;/strong&gt; — where you write measures that navigate relationships at query time to produce calculated results.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;A well-built model is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Accurate&lt;/strong&gt; — your numbers are correct because filters flow through relationships properly&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fast&lt;/strong&gt; — fewer redundant columns mean smaller file sizes and quicker refresh&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scalable&lt;/strong&gt; — adding a new report page doesn't require restructuring the entire model&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The three pillars of Power BI modeling are &lt;strong&gt;joins&lt;/strong&gt;, &lt;strong&gt;relationships&lt;/strong&gt;, and &lt;strong&gt;schemas&lt;/strong&gt;. Let's tackle each one.&lt;/p&gt;

&lt;h2&gt;
  
  
  Section 2 - SQL Joins
&lt;/h2&gt;

&lt;p&gt;Before a table loads in your Power BI model, you may need to combine it with another table in Power Query. This is done using &lt;strong&gt;joins&lt;/strong&gt; operations. This is a merge option where you decide, based on the join type used, which rows from each table make it into the resulting table.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Load Data in Power BI
In Power BI Desktop, connect the Excel Workbook as a data source, open the ShopEase file,select all the sheets and click the Transform Data button on Dialogue box. The Power Query Editor window opens.&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;Select your LEFT table in the left panel - click on the table you want to be on the left side of the join (e.g. Customers). It becomes the base table — all rows from it are your starting point.&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;Merge Queries
Click Home -&amp;gt; Merge Queries -&amp;gt; Merge Queries&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;A dialog box opens. Your current (left) table is shown at the top.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Select the RIGHT table and matching columns.&lt;br&gt;
Use the dropdown to pick your second (right) table (e.g. Sales). Then click the matching column in the top table, then click the same column in the bottom table. Both should now be highlighted.&lt;br&gt;
For ShopEase: click CustomerID in Customers, then click CustomerID in Sales.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Pick the Join Kind from the dropdown&lt;br&gt;
At the bottom of the dialog there's a Join Kind dropdown. This is where you choose INNER, LEFT OUTER, etc. Click OK.&lt;br&gt;
Join Kind:&lt;/p&gt;&lt;/li&gt;
&lt;/ol&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%2Fue21uk2i47i6h7uhd9pg.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%2Fue21uk2i47i6h7uhd9pg.png" alt=" " width="800" height="423"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Expand the merged column&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;A new column appears called Sales (or whatever your right table is named) with a table icon. Click the expand icon (two arrows) in that column header, uncheck any columns you don't need, and click OK. The right table's columns now appear.&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%2Fx5h9uflyuy8tmrpktcni.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%2Fx5h9uflyuy8tmrpktcni.png" alt=" " width="800" height="264"&gt;&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%2F1yzyjg42vvt1vuy07lnc.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%2F1yzyjg42vvt1vuy07lnc.png" alt=" " width="800" height="226"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This process is repeated for all joins in this article.Feel free to repeat with the different join types explained in this section.Use Sales Table and Customer Table with the different joins.&lt;/p&gt;

&lt;h4&gt;
  
  
  Inner Join  — The Intersection
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;what it returns: **Only rows that have a matching value in **both&lt;/strong&gt; tables.&lt;br&gt;
It answers a question such as &lt;strong&gt;Which orders have a known customer record?&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%2F1yzyjg42vvt1vuy07lnc.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%2F1yzyjg42vvt1vuy07lnc.png" alt=" " width="800" height="226"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  LEFT OUTER JOIN — Keep Everything on the Left
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;What it returns:&lt;/strong&gt; All rows from the left table, plus matching rows from the right. Where there's no match, right-side columns are &lt;code&gt;null&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Real-life question:&lt;/strong&gt; &lt;em&gt;Show me all customers, and include their orders if they have any. Show customers even if they haven't ordered yet.&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%2Fwnipomknwxt8o8jbfzey.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%2Fwnipomknwxt8o8jbfzey.png" alt=" " width="800" height="280"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  RIGHT OUTER JOIN — Keep Everything on the Right
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;What it returns:&lt;/strong&gt; All rows from the right table, plus matching rows from the left. Where there's no match, left-side columns are &lt;code&gt;null&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Real-life question:&lt;/strong&gt; &lt;em&gt;Show me all orders, and include customer details if available — even if an order has no customer record.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;This is the mirror of a LEFT JOIN. In practice, you can always replicate a RIGHT JOIN by swapping the table order and using a LEFT JOIN, which is why many analysts use LEFT JOINs exclusively.&lt;br&gt;
&amp;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%2Ffwoauu0izo8393vld7c7.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%2Ffwoauu0izo8393vld7c7.png" alt=" " width="800" height="246"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  FULL OUTER JOIN — Keep Everything from Both
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;What it returns:&lt;/strong&gt; All rows from both tables. Matched where possible; &lt;code&gt;null&lt;/code&gt; fills in where there's no match on either side.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Real-life question:&lt;/strong&gt; &lt;em&gt;Give me a complete picture — every customer and every order — whether or not they match.&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%2Fnjyad54pexupgxckbve8.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%2Fnjyad54pexupgxckbve8.png" alt=" " width="800" height="281"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  LEFT ANTI JOIN — What's Missing on the Right
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;What it returns:&lt;/strong&gt; Only the rows from the left table that have &lt;strong&gt;no match&lt;/strong&gt; in the right table. This is the opposite of a JOIN — it finds the gaps.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Real-life question:&lt;/strong&gt; &lt;em&gt;Which customers have NEVER placed an order?&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%2Fxhd06sx5mn35d79s2vlh.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%2Fxhd06sx5mn35d79s2vlh.png" alt=" " width="800" height="105"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  RIGHT ANTI JOIN — What's Missing on the Left
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;What it returns:&lt;/strong&gt; Only the rows from the right table that have &lt;strong&gt;no match&lt;/strong&gt; in the left table.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Real-life question:&lt;/strong&gt; &lt;em&gt;Which orders have no matching customer record? (Potential data integrity issue!)&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%2Fuzjbh4ipp1mfvd7a8vol.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%2Fuzjbh4ipp1mfvd7a8vol.png" alt=" " width="800" height="195"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Section 3 — Power BI Relationships vs. SQL Joins
&lt;/h3&gt;

&lt;p&gt;This is the most important conceptual distinction in this entire article. Many Power BI users use these terms interchangeably — they are not the same thing.&lt;/p&gt;

&lt;h4&gt;
  
  
  Joins: Physical Combination
&lt;/h4&gt;

&lt;p&gt;When you merge two tables in Power Query, you create &lt;strong&gt;one new table&lt;/strong&gt; by stitching columns together. This happens once at refresh time. The result is stored in memory. This is great when you genuinely need data from another table as a column — for example, adding &lt;code&gt;CustomerName&lt;/code&gt; to your Sales table.&lt;/p&gt;

&lt;p&gt;But if you merge every table into one giant flat table, you lose all flexibility. You can't filter a slicer on the Customers table if Customers doesn't exist as a separate table in your model.&lt;/p&gt;

&lt;h4&gt;
  
  
  Relationships: Logical Links
&lt;/h4&gt;

&lt;p&gt;When you create a relationship in Model View, the two tables remain &lt;strong&gt;completely separate&lt;/strong&gt;. Power BI simply knows that the &lt;code&gt;CustomerID&lt;/code&gt; in Sales points to the &lt;code&gt;CustomerID&lt;/code&gt; in Customers. When a user clicks a slicer or drops a field from either table into a visual, Power BI uses the relationship to propagate filters dynamically at query time.&lt;/p&gt;

&lt;p&gt;This is what makes Power BI so powerful for reporting — your Customers table can filter your Sales table, your Products table, and your Returns table simultaneously, all through relationships, without ever merging anything.&lt;/p&gt;

&lt;h4&gt;
  
  
  When to Use Which
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Use a join (Power Query merge)&lt;/strong&gt; when you need a column from another table baked into your fact table (e.g., adding a category name directly to Sales for a calculated column).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use a relationship (Model View)&lt;/strong&gt; for everything else — filtering, slicers, cross-table aggregations.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Section 4 — Power BI Relationships Deep Dive
&lt;/h2&gt;

&lt;h3&gt;
  
  
  4.1 Cardinality
&lt;/h3&gt;

&lt;p&gt;Cardinality describes how many rows on one side of a relationship can match rows on the other side.&lt;/p&gt;

&lt;h4&gt;
  
  
  One-to-Many (1:M) — The Workhorse
&lt;/h4&gt;

&lt;p&gt;One row in the dimension table matches many rows in the fact table.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The "one" side&lt;/strong&gt; (Customers) is the &lt;strong&gt;dimension&lt;/strong&gt; — it contains unique values per key.&lt;br&gt;&lt;br&gt;
&lt;strong&gt;The "many" side&lt;/strong&gt; (Sales) is the &lt;strong&gt;fact&lt;/strong&gt; — it contains repeated keys with transactional data.&lt;/p&gt;

&lt;p&gt;This is the most common and recommended relationship type. It's clean, unambiguous, and performs well.&lt;/p&gt;

&lt;h4&gt;
  
  
  Many-to-Many (M:M)
&lt;/h4&gt;

&lt;p&gt;Many rows in table A match many rows in table B.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt; If a single order could contain multiple products AND a product could appear in multiple orders — without an intermediate table — you'd have M:M. Power BI does support M:M relationships, but they come with performance costs and can cause unexpected filter behavior.&lt;/p&gt;

&lt;h4&gt;
  
  
  One-to-One (1:1)
&lt;/h4&gt;

&lt;p&gt;One row in table A matches exactly one row in table B.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt; A separate &lt;code&gt;CustomerDetails&lt;/code&gt; table with extended profile information, where each customer appears exactly once in both tables.&lt;/p&gt;

&lt;p&gt;In practice, 1:1 relationships are rare and usually signal that the two tables should simply be merged into one. Use them only when you have a deliberate reason to keep tables separate (e.g., different refresh schedules, security purposes).&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%2Ffm6hi2qwkw5ol7y467hi.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%2Ffm6hi2qwkw5ol7y467hi.png" alt=" " width="800" height="352"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  4.2 Cross-Filter Direction
&lt;/h3&gt;

&lt;p&gt;Cross-filter direction controls how filters flow across a relationship — specifically, which table's selections affect the other.&lt;/p&gt;

&lt;h4&gt;
  
  
  Single Direction (Recommended Default)
&lt;/h4&gt;

&lt;p&gt;Filters flow from the &lt;strong&gt;"one" side&lt;/strong&gt; to the &lt;strong&gt;"many" side&lt;/strong&gt; only.&lt;/p&gt;

&lt;p&gt;In the Customers → Sales relationship with Single direction:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Selecting a customer in a slicer &lt;strong&gt;will&lt;/strong&gt; filter the Sales table &lt;/li&gt;
&lt;li&gt;A filter on Sales &lt;strong&gt;will not&lt;/strong&gt; automatically filter the Customers table &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is the correct behavior for most reporting scenarios. Filters flow "downstream" from dimensions to facts — exactly how you want slicers and visuals to work.&lt;/p&gt;

&lt;h4&gt;
  
  
  Both Directions (Bidirectional)
&lt;/h4&gt;

&lt;p&gt;Filters flow in &lt;strong&gt;both directions&lt;/strong&gt; between the two tables.&lt;/p&gt;

&lt;p&gt;This sounds convenient — and occasionally it is — but it introduces serious risks:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Ambiguity:&lt;/strong&gt; When multiple relationship paths exist, Power BI may not know which path to use&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Circular dependencies:&lt;/strong&gt; Bidirectional relationships can create loops that Power BI can't resolve&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Unexpected filter behavior:&lt;/strong&gt; A filter on one table may unexpectedly filter other tables&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;When bidirectional is acceptable:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Many-to-Many relationships (with a bridge table) sometimes need it&lt;/li&gt;
&lt;li&gt;Specific calculated measures where you need reverse filtering&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4.3 Active vs. Inactive Relationships
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Only one relationship can be active between any two tables at a time.&lt;/strong&gt; This creates a challenge when you need to connect two tables via multiple paths.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The classic ShopEase problem:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Our Sales table has &lt;strong&gt;two date columns&lt;/strong&gt;: &lt;code&gt;OrderDate&lt;/code&gt; and &lt;code&gt;ShipDate&lt;/code&gt;. Our Date dimension table needs to connect to both. But Power BI only allows one active relationship.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Solution:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Create an &lt;strong&gt;active&lt;/strong&gt; relationship between &lt;code&gt;Date[DateKey]&lt;/code&gt; and &lt;code&gt;Sales[OrderDate]&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Create an &lt;strong&gt;inactive&lt;/strong&gt; relationship between &lt;code&gt;Date[DateKey]&lt;/code&gt; and &lt;code&gt;Sales[ShipDate]&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In Model View, active relationships appear as &lt;strong&gt;solid lines&lt;/strong&gt;. Inactive relationships appear as &lt;strong&gt;dotted lines&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Section 5 — Fact Tables vs. Dimension Tables
&lt;/h2&gt;

&lt;p&gt;Every well-structured Power BI model is built around a clear distinction between two types of tables.&lt;/p&gt;

&lt;h3&gt;
  
  
  Fact Tables
&lt;/h3&gt;

&lt;p&gt;A fact table contains &lt;strong&gt;measurable, transactional events&lt;/strong&gt;. Each row represents something that happened — a sale, a return, a login, a payment.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Characteristics:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Contains numeric measures (Quantity, TotalAmount, Revenue, Cost)&lt;/li&gt;
&lt;li&gt;Contains foreign keys that point to dimension tables&lt;/li&gt;
&lt;li&gt;Usually has many rows (thousands to millions)&lt;/li&gt;
&lt;li&gt;Relatively few columns&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Dimension Tables
&lt;/h3&gt;

&lt;p&gt;A dimension table contains &lt;strong&gt;descriptive attributes&lt;/strong&gt; used to filter, group, and label your facts.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Characteristics:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Contains a unique primary key (one row per entity)&lt;/li&gt;
&lt;li&gt;Contains many descriptive columns (names, categories, addresses)&lt;/li&gt;
&lt;li&gt;Usually has fewer rows than fact tables&lt;/li&gt;
&lt;li&gt;Wide tables are fine here&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Section 6 — Schemas
&lt;/h2&gt;

&lt;p&gt;A schema is the overall shape of your data model — how tables are organized and connected. There are three main patterns.&lt;/p&gt;

&lt;h3&gt;
  
  
  6.1 Star Schema
&lt;/h3&gt;

&lt;p&gt;The star schema places a single fact table at the center, surrounded by flat (denormalized) dimension tables — like a star.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key rules of a star schema:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Dimension tables are &lt;strong&gt;flat&lt;/strong&gt; — no dimension links to another dimension&lt;/li&gt;
&lt;li&gt;Each dimension has a single primary key&lt;/li&gt;
&lt;li&gt;All joins go through the fact table&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Advantages:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Simple to understand — even non-technical stakeholders get it&lt;/li&gt;
&lt;li&gt;Maximum DAX performance — filter paths are short and unambiguous&lt;/li&gt;
&lt;li&gt;Easy to add new dimensions without restructuring&lt;/li&gt;
&lt;li&gt;Slicers and cross-filtering work predictably&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Use when:&lt;/strong&gt; Building any report-ready Power BI model. This should be your default.&lt;/p&gt;

&lt;h3&gt;
  
  
  6.2 Snowflake Schema
&lt;/h3&gt;

&lt;p&gt;The snowflake schema &lt;strong&gt;normalizes&lt;/strong&gt; dimension tables — meaning dimension attributes are broken into sub-tables, which branch off like a snowflake.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Advantages:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Reduces data redundancy (the word "Electronics" is stored once, not repeated per product)&lt;/li&gt;
&lt;li&gt;Mirrors normalized source systems (SQL Server databases often look like this)&lt;/li&gt;
&lt;li&gt;Easier to maintain category hierarchies&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Disadvantages:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;More tables, more relationships = more complexity in Model View&lt;/li&gt;
&lt;li&gt;Slightly slower DAX queries (more hops for the filter engine)&lt;/li&gt;
&lt;li&gt;Harder for end users and new team members to navigate&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Use when:&lt;/strong&gt; Your source data warehouse is already normalized and restructuring it in Power Query isn't practical. Or when you have deep hierarchies (Region → Country → Province → City) that genuinely benefit from normalization.&lt;/p&gt;

&lt;h3&gt;
  
  
  6.3 Flat Table / Denormalized Table (DLAT)
&lt;/h3&gt;

&lt;p&gt;A flat table (also called a &lt;strong&gt;DLAT — Denormalized, Large, All-in-one Table&lt;/strong&gt;) puts everything into one wide table with no relationships at all.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Advantages:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Extremely simple — no relationship configuration needed&lt;/li&gt;
&lt;li&gt;Easy to understand for non-technical users&lt;/li&gt;
&lt;li&gt;Quick to set up for simple, single-subject reports&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Disadvantages:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Massive redundancy — "Alice Mokoena" and "Johannesburg" are repeated in every one of her rows&lt;/li&gt;
&lt;li&gt;Large file sizes and slow refreshes&lt;/li&gt;
&lt;li&gt;Impossible to reuse dimension data across multiple fact tables&lt;/li&gt;
&lt;li&gt;Slicers can produce incorrect counts (e.g., a customer appears 3 times in a list)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Use when:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Quick one-off prototypes&lt;/li&gt;
&lt;li&gt;Very simple, single-table dashboards&lt;/li&gt;
&lt;li&gt;Sharing data with users who need to work in Excel&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Section 7 — Role-Playing Dimensions
&lt;/h2&gt;

&lt;p&gt;A &lt;strong&gt;role-playing dimension&lt;/strong&gt; is a single dimension table that's used multiple times in the same model, each time serving a different purpose — a different "role."&lt;/p&gt;

&lt;p&gt;The most common example is the &lt;strong&gt;Date&lt;/strong&gt; dimension. In ShopEase, our Sales table has two date columns:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;OrderDate&lt;/code&gt; — when the order was placed&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ShipDate&lt;/code&gt; — when the order was dispatched&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Both dates are meaningful for reporting. But we only want to maintain one Date dimension table (with Year, Month, Quarter, etc.) — not two identical copies.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;When to use which approach:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Duplicate table&lt;/strong&gt; — when your users need to use both date hierarchies side-by-side in the same visual (e.g., slicing by Order Month AND Ship Month simultaneously)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Inactive + USERELATIONSHIP&lt;/strong&gt; — when you want a clean, memory-efficient model and the alternate date is only needed in specific measures&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;Data modeling in Power BI is not a step you do once and forget — it's a discipline that shapes every number your reports produce and every second your refresh takes.&lt;/p&gt;

&lt;p&gt;Here's the hierarchy to keep in mind:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Joins (Power Query):&lt;/strong&gt; Combine tables physically when you need columns from different sources baked into one table. Use the right join type for the right question.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Relationships (Model View):&lt;/strong&gt; Link tables logically so filters can flow between them at report time. Keep them directional and cardinality-correct.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Schemas:&lt;/strong&gt; Organize your tables into a Star Schema wherever possible. It's the fastest, simplest, and most maintainable structure for Power BI.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DAX:&lt;/strong&gt; Navigate and manipulate relationships in your measures when the model structure alone isn't enough.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The golden rule is simple: &lt;strong&gt;model for clarity and performance, not convenience.&lt;/strong&gt; The temptation to dump everything into a flat table is real — it feels fast in the moment. But the debt compounds quickly. A well-structured star schema takes an afternoon to set up and saves you months of debugging.&lt;/p&gt;

&lt;p&gt;Your next steps: load the ShopEase tables into Power BI, recreate the star schema from this article, experiment with each join type in Power Query, and try building a &lt;code&gt;Sales by Ship Date&lt;/code&gt; measure using &lt;code&gt;USERELATIONSHIP()&lt;/code&gt;. The concepts click fastest when your hands are on the keyboard.&lt;/p&gt;

</description>
      <category>powerfuldevs</category>
      <category>data</category>
      <category>dataengineering</category>
    </item>
    <item>
      <title>How Linux is Used in Real-World Data Engineering</title>
      <dc:creator>Abdi Omari</dc:creator>
      <pubDate>Sat, 21 Mar 2026 05:25:02 +0000</pubDate>
      <link>https://dev.to/abdiomari/linux-fundamentals-for-data-engineering-4gh2</link>
      <guid>https://dev.to/abdiomari/linux-fundamentals-for-data-engineering-4gh2</guid>
      <description>&lt;p&gt;Linux stands out as a usefool tool in data engineering because of it's unique features: the Command Line interface CLI, Compatibility with most Data Tools, Security and Scalability as well as cost effectiveness due to being an open source platform. These attributes make the work of an individual or organisation in Data Engineering easier. &lt;br&gt;
As a beginner here are some of the things to look out for as you start your journer in Data Engineering.&lt;/p&gt;
&lt;h2&gt;
  
  
  Using the CLI
&lt;/h2&gt;

&lt;p&gt;The Command Line Interface is a tool used to interact with programs using commands, more like shortcuts to get things done faster.&lt;br&gt;
It involves typing reserved words(Commands) in an interface that does not allow use of other input devices such as a mouse. While most beginners find this unconventional, mastery of the CLI will make you realise it is one of the easiest and most convenient tools moreso in Data Engineering.&lt;/p&gt;

&lt;p&gt;The CLI can be used to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt; Manage files and folders better known as directories&lt;/li&gt;
&lt;li&gt; Manage processes and running applications&lt;/li&gt;
&lt;li&gt; Configure and manage your network &lt;/li&gt;
&lt;li&gt; Check system information&lt;/li&gt;
&lt;li&gt; Process,compress and archive data&lt;/li&gt;
&lt;li&gt; Create scripts
and many more&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Here is what you need to get started:&lt;/p&gt;
&lt;h3&gt;
  
  
  Navigating the CLI
&lt;/h3&gt;

&lt;p&gt;While the CLI usually seems intimidating to a new user, familiarity and ease builds up by knowing the right tips and tricks. &lt;/p&gt;

&lt;p&gt;Get used to using the keyboard only. &lt;br&gt;
To run a command type the command and hit enter(the cli will respond by running the command or give you an error&lt;br&gt;
To clear your screen - use a command clear or ctrl + l &lt;br&gt;
To use a recently used command - use the up arrow key&lt;br&gt;
To interrupt a process before it completes - ctrl + c&lt;br&gt;
To autocomplete use tab key&lt;br&gt;
to Copy or paste text - ctrl + shift + c/v&lt;br&gt;
To open a new tab - ctrl + shift + T &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt; Basic commands that you need to know for Data engineering basics
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;Commands &lt;span class="k"&gt;in &lt;/span&gt;file management
&lt;span class="nb"&gt;mkdir&lt;/span&gt; &amp;lt;directory name&amp;gt; - Create a directory
&lt;span class="nb"&gt;pwd&lt;/span&gt; - print working directory
&lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-List&lt;/span&gt; directory contents
&lt;span class="nb"&gt;cd&lt;/span&gt; - change directory
&lt;span class="nb"&gt;rm&lt;/span&gt; - remove an empty directory
&lt;span class="nb"&gt;cp&lt;/span&gt; - copy files or directories
scp - securely copy files to a server
&lt;span class="nb"&gt;mv&lt;/span&gt; - move or rename files 
&lt;span class="nb"&gt;touch&lt;/span&gt; - create an empty file
&lt;span class="nb"&gt;cat&lt;/span&gt; - concatenate and display contents &lt;span class="k"&gt;in &lt;/span&gt;a file
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;File management is important to allow or deny different users to make changes to your files.&lt;/p&gt;

&lt;p&gt;Think of 3 people working on a document where Person A is allowed to view, edit and process the document, Person B can only do two of the activities and person C can only do one. &lt;br&gt;
this protects the document from unintentional distortion or unwanted changes. &lt;br&gt;
A rule of thumb is the principle of least privilege where a user is given only the level of access they need.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;File permissions 
&lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-l&lt;/span&gt; - view permissions
&lt;span class="nb"&gt;chmod&lt;/span&gt; - modify permissions &lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="nb"&gt;users&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;wget - download files from the web
curl - transfer data from or to a server
ssh - connect to a remote server securely 
scp - securely copy files to a server
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Let us look at an example of how to work with terminal as a data engineer&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Create a directory, navigate to the directory and create a new file. -file.txt&lt;br&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%2Fvtjb2nm0jlelgvhhvwx1.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%2Fvtjb2nm0jlelgvhhvwx1.png" alt="CLI screenshot showing the result of the linux command" width="691" height="431"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add some text to the file using vi or nano (inbuilt editors)&lt;/p&gt;&lt;/li&gt;
&lt;/ol&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%2Fc30amm8k5bl9qt9e158n.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%2Fc30amm8k5bl9qt9e158n.png" alt="CLI screenshot showing the result of the linux command" width="689" height="96"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Check file permissions&lt;/li&gt;
&lt;/ol&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%2Fnsbv9l2vqhtvub8zle6u.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%2Fnsbv9l2vqhtvub8zle6u.png" alt="CLI screenshot showing the result of the linux command" width="764" height="109"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We can also download other tools using the CLI. An example is Docker - a containerization tool used by engineers to build, ship and run applications in lightweight packages called containers. &lt;/p&gt;

&lt;p&gt;On a linux based terminal:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Download the script
&lt;code&gt;curl -fsSL https://get.docker.com -o get-docker.sh
&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Run the script&lt;br&gt;
&lt;code&gt;sudo sh get-docker.sh&lt;/code&gt;&lt;br&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%2Fjz58nmbfojh0oh7eknry.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%2Fjz58nmbfojh0oh7eknry.png" alt="CLI screenshot showing the result of the linux command" width="764" height="432"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Check if Docker is successfully installed &lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;code&gt;docker --version&lt;/code&gt; or &lt;code&gt;docker version&lt;/code&gt; for extra details &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%2Fu98oz2431boh7ng8x1qs.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%2Fu98oz2431boh7ng8x1qs.png" alt="CLI screenshot showing the result of the linux command" width="746" height="291"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>linux</category>
      <category>dataengineering</category>
      <category>beginners</category>
    </item>
  </channel>
</rss>
