<?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: adrian</title>
    <description>The latest articles on Forem by adrian (@dlt-library).</description>
    <link>https://forem.com/dlt-library</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%2F1154017%2F746229f0-6d99-492b-b4e0-7e28499478e4.png</url>
      <title>Forem: adrian</title>
      <link>https://forem.com/dlt-library</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/dlt-library"/>
    <language>en</language>
    <item>
      <title>Weather api list &amp; pipelines</title>
      <dc:creator>adrian</dc:creator>
      <pubDate>Tue, 31 Oct 2023 09:31:24 +0000</pubDate>
      <link>https://forem.com/dlt-library/weather-api-list-pipelines-2g2i</link>
      <guid>https://forem.com/dlt-library/weather-api-list-pipelines-2g2i</guid>
      <description>&lt;p&gt;I used the public api list to look for weather apis and qualify their pros, cons and usage. &lt;/p&gt;

&lt;p&gt;Here is the outcome, that will easily allow you to pick one suitable for you.&lt;/p&gt;

&lt;p&gt;Tier 1 (Highly Popular and Widely Used)&lt;br&gt;
Tier 2 (Respected and Reliable)&lt;br&gt;
Tier 3 (Specialized or Geographic Focus)&lt;br&gt;
Tier 4 (Limited or Niche Use)&lt;/p&gt;

&lt;p&gt;want to use them? build a pipeline in minutes using this guide and the GPT assistant&lt;br&gt;
&lt;a href="https://dlthub.com/docs/build-a-pipeline-tutorial"&gt;https://dlthub.com/docs/build-a-pipeline-tutorial&lt;/a&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tier&lt;/th&gt;
&lt;th&gt;API Name&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;th&gt;Auth&lt;/th&gt;
&lt;th&gt;HTTPS&lt;/th&gt;
&lt;th&gt;CORS&lt;/th&gt;
&lt;th&gt;Pros&lt;/th&gt;
&lt;th&gt;Cons&lt;/th&gt;
&lt;th&gt;API Documentation&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Tier 1&lt;/td&gt;
&lt;td&gt;&lt;a href="https://openweathermap.org/api"&gt;&lt;strong&gt;OpenWeatherMap&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Provides weather data for any location worldwide.&lt;/td&gt;
&lt;td&gt;apiKey&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Unknown&lt;/td&gt;
&lt;td&gt;- Offers a wide range of weather data&lt;/td&gt;
&lt;td&gt;- Free tier has limited requests per minute&lt;/td&gt;
&lt;td&gt;&lt;a href="https://openweathermap.org/api"&gt;OpenWeatherMap API&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tier 1&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.weatherbit.io/api"&gt;&lt;strong&gt;Weatherbit&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Weather data and forecasts.&lt;/td&gt;
&lt;td&gt;apiKey&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Unknown&lt;/td&gt;
&lt;td&gt;- Provides forecasts up to 16 days ahead&lt;/td&gt;
&lt;td&gt;- Limited daily requests&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.weatherbit.io/api"&gt;Weatherbit API&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tier 1&lt;/td&gt;
&lt;td&gt;&lt;a href="https://developer.accuweather.com/apis"&gt;&lt;strong&gt;AccuWeather&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Weather and forecast data&lt;/td&gt;
&lt;td&gt;apiKey&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Unknown&lt;/td&gt;
&lt;td&gt;- Offers detailed forecasts&lt;/td&gt;
&lt;td&gt;- Limited free tier&lt;/td&gt;
&lt;td&gt;&lt;a href="https://developer.accuweather.com/apis"&gt;AccuWeather API&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tier 1&lt;/td&gt;
&lt;td&gt;&lt;a href="https://docs.tomorrow.io"&gt;&lt;strong&gt;Tomorrow&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Weather API Powered by Proprietary Technology&lt;/td&gt;
&lt;td&gt;apiKey&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Unknown&lt;/td&gt;
&lt;td&gt;- Powered by proprietary tech&lt;/td&gt;
&lt;td&gt;- Limited free tier, rate limits&lt;/td&gt;
&lt;td&gt;&lt;a href="https://docs.tomorrow.io"&gt;Tomorrow API&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tier 2&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.metaweather.com/api/"&gt;&lt;strong&gt;MetaWeather&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Weather&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;- CORS support&lt;/td&gt;
&lt;td&gt;- Limited features&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.metaweather.com/api/"&gt;MetaWeather API&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tier 2&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.weather.gov/documentation/services-web-api"&gt;&lt;strong&gt;US Weather&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;US National Weather Service&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;- Official source for US weather&lt;/td&gt;
&lt;td&gt;- Limited to US weather data&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.weather.gov/documentation/services-web-api"&gt;US Weather API&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tier 2&lt;/td&gt;
&lt;td&gt;&lt;a href="https://stormglass.io/"&gt;&lt;strong&gt;Storm Glass&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Global marine weather from multiple sources&lt;/td&gt;
&lt;td&gt;apiKey&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;- Specialized in marine weather&lt;/td&gt;
&lt;td&gt;- Limited free tier, rate limits&lt;/td&gt;
&lt;td&gt;&lt;a href="https://stormglass.io/"&gt;Storm Glass API&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tier 2&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.visualcrossing.com/weather-api"&gt;&lt;strong&gt;Visual Crossing&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Global historical and weather forecast data&lt;/td&gt;
&lt;td&gt;apiKey&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;- Historical and forecast data&lt;/td&gt;
&lt;td&gt;- Limited free tier, rate limits&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.visualcrossing.com/weather-api"&gt;Visual Crossing API&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tier 3&lt;/td&gt;
&lt;td&gt;&lt;a href="https://aqicn.org/api/"&gt;&lt;strong&gt;AQICN&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Air Quality Index Data for over 1000 cities&lt;/td&gt;
&lt;td&gt;apiKey&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Unknown&lt;/td&gt;
&lt;td&gt;- Air quality data for cities&lt;/td&gt;
&lt;td&gt;- Focus on air quality, not weather&lt;/td&gt;
&lt;td&gt;&lt;a href="https://aqicn.org/api/"&gt;AQICN API&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tier 3&lt;/td&gt;
&lt;td&gt;&lt;a href="https://open.caiyunapp.com/ColorfulClouds_Weather_API"&gt;&lt;strong&gt;ColorfulClouds&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Weather&lt;/td&gt;
&lt;td&gt;apiKey&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;- CORS support&lt;/td&gt;
&lt;td&gt;- Limited to specific regions&lt;/td&gt;
&lt;td&gt;&lt;a href="https://open.caiyunapp.com/ColorfulClouds_Weather_API"&gt;ColorfulClouds API&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tier 3&lt;/td&gt;
&lt;td&gt;&lt;a href="https://hgbrasil.com/status/weather"&gt;&lt;strong&gt;HG Weather&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Provides weather forecast data for cities in Brazil&lt;/td&gt;
&lt;td&gt;apiKey&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;- Brazil-specific weather data&lt;/td&gt;
&lt;td&gt;- Limited to Brazil&lt;/td&gt;
&lt;td&gt;&lt;a href="https://hgbrasil.com/status/weather"&gt;HG Weather API&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tier 3&lt;/td&gt;
&lt;td&gt;&lt;a href="https://opendata.euskadi.eus/api-euskalmet/-/api-de-euskalmet/"&gt;&lt;strong&gt;Euskalmet&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Meteorological data of the Basque Country&lt;/td&gt;
&lt;td&gt;apiKey&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Unknown&lt;/td&gt;
&lt;td&gt;- Spain-specific weather data&lt;/td&gt;
&lt;td&gt;- Limited geographic coverage&lt;/td&gt;
&lt;td&gt;&lt;a href="https://opendata.euskadi.eus/api-euskalmet/-/api-de-euskalmet/"&gt;Euskalmet API&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tier 3&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.hko.gov.hk/en/abouthko/opendata_intro.htm"&gt;&lt;strong&gt;Hong Kong Observatory&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Provide weather information, earthquake information, and climate data&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Unknown&lt;/td&gt;
&lt;td&gt;- Official source for Hong Kong&lt;/td&gt;
&lt;td&gt;- Limited geographic focus&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.hko.gov.hk/en/abouthko/opendata_intro.htm"&gt;Hong Kong Observatory API&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tier 3&lt;/td&gt;
&lt;td&gt;&lt;a href="https://docs.oikolab.com"&gt;&lt;strong&gt;Oikolab&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;70+ years of global, hourly historical and forecast weather data from NOAA and ECMWF&lt;/td&gt;
&lt;td&gt;apiKey&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;- Historical data and forecasts&lt;/td&gt;
&lt;td&gt;- Limited free tier, rate limits&lt;/td&gt;
&lt;td&gt;&lt;a href="https://docs.oikolab.com"&gt;Oikolab API&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tier 3&lt;/td&gt;
&lt;td&gt;&lt;a href="https://m3o.com/weather/api"&gt;&lt;strong&gt;Micro Weather&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Real-time weather forecasts and historic data&lt;/td&gt;
&lt;td&gt;apiKey&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Unknown&lt;/td&gt;
&lt;td&gt;- Real-time and historic data&lt;/td&gt;
&lt;td&gt;- Limited free tier, rate limits&lt;/td&gt;
&lt;td&gt;&lt;a href="https://m3o.com/weather/api"&gt;Micro Weather API&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tier 4&lt;/td&gt;
&lt;td&gt;&lt;a href="http://api.oceandrivers.com/static/docs.html"&gt;&lt;strong&gt;ODWeather&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Weather and weather webcams&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Unknown&lt;/td&gt;
&lt;td&gt;- Offers webcams with weather&lt;/td&gt;
&lt;td&gt;- Limited features&lt;/td&gt;
&lt;td&gt;&lt;a href="http://api.oceandrivers.com/static/docs.html"&gt;ODWeather API&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tier 4&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.openuv.io"&gt;&lt;strong&gt;OpenUV&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Real-time UV Index Forecast&lt;/td&gt;
&lt;td&gt;apiKey&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Unknown&lt;/td&gt;
&lt;td&gt;- Specialized in UV Index&lt;/td&gt;
&lt;td&gt;- Limited to UV data&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.openuv.io"&gt;OpenUV API&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tier 4&lt;/td&gt;
&lt;td&gt;&lt;a href="https://weatherstack.com/"&gt;&lt;strong&gt;apilayer weatherstack&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Real-Time &amp;amp; Historical World Weather Data API&lt;/td&gt;
&lt;td&gt;apiKey&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Unknown&lt;/td&gt;
&lt;td&gt;- Real-time and historical data&lt;/td&gt;
&lt;td&gt;- Limited free tier, rate limits&lt;/td&gt;
&lt;td&gt;&lt;a href="https://weatherstack.com/"&gt;apilayer weatherstack API&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tier 4&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.apixu.com/doc/request.aspx"&gt;&lt;strong&gt;APIXU&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Weather&lt;/td&gt;
&lt;td&gt;apiKey&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Unknown&lt;/td&gt;
&lt;td&gt;- Provides general weather info&lt;/td&gt;
&lt;td&gt;- Limited free tier, branding&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.apixu.com/doc/request.aspx"&gt;APIXU API&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tier 4&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.weatherapi.com/"&gt;&lt;strong&gt;WeatherAPI&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Weather API with other stuff like Astronomy and Geolocation API&lt;/td&gt;
&lt;td&gt;apiKey&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;- Additional features&lt;/td&gt;
&lt;td&gt;- Limited free tier, branding&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.weatherapi.com/"&gt;WeatherAPI&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tier 4&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/robertoduessmann/weather-api"&gt;&lt;strong&gt;Weather-api&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;A RESTful free API to check the weather&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;- Free and open access&lt;/td&gt;
&lt;td&gt;- Limited features&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/robertoduessmann/weather-api"&gt;Weather-api&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tier 4&lt;/td&gt;
&lt;td&gt;&lt;a href="http://www.7timer.info/doc.php?lang=en"&gt;&lt;strong&gt;7Timer!&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Weather, especially for Astroweather&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Unknown&lt;/td&gt;
&lt;td&gt;- Specialized in astro-weather&lt;/td&gt;
&lt;td&gt;- Limited features&lt;/td&gt;
&lt;td&gt;&lt;a href="http://www.7timer.info/doc.php?lang=en"&gt;7Timer! API&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tier 4&lt;/td&gt;
&lt;td&gt;&lt;a href="https://yandex.com/dev/weather/"&gt;&lt;strong&gt;Yandex.Weather&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Assesses weather condition in specific locations&lt;/td&gt;
&lt;td&gt;apiKey&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;- Assessing weather conditions&lt;/td&gt;
&lt;td&gt;- Limited geographic coverage&lt;/td&gt;
&lt;td&gt;&lt;a href="https://yandex.com/dev/weather/"&gt;Yandex.Weather API&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

</description>
    </item>
    <item>
      <title>Haunted data pipeline</title>
      <dc:creator>adrian</dc:creator>
      <pubDate>Mon, 30 Oct 2023 17:29:50 +0000</pubDate>
      <link>https://forem.com/dlt-library/haunted-data-pipeline-4al5</link>
      <guid>https://forem.com/dlt-library/haunted-data-pipeline-4al5</guid>
      <description>&lt;p&gt;Suppose in the spirit of haloween, you want to add some haunting to your DWH. How do you do that?&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Create a function that returns some strange messages&lt;/li&gt;
&lt;li&gt;Call it from your pipelines to log the strangeness for lols&lt;/li&gt;
&lt;li&gt;Watch the logs get haunted :)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Sample code below. Happy haunting!&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;requests&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;bs4&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;BeautifulSoup&lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;random&lt;/span&gt;


&lt;span class="c1"&gt;# Function to fetch spooky quotes from Goodreads
&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;fetch_spooky_quotes_goodreads&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"https://www.goodreads.com/quotes/tag/spooky"&lt;/span&gt;
    &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;soup&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;BeautifulSoup&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;'html.parser'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;quotes&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;soup&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;find_all&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'div'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;class_&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;'quoteText'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;quote&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;quotes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;yield&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;quote&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;



&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;generate_dummy_data&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;num_rows&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1000000&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;num_rows&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="s"&gt;'ID'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s"&gt;'Name'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s"&gt;'Name_&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s"&gt;'Age'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;random&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;randint&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;18&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;70&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
            &lt;span class="s"&gt;'Gender'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;random&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;choice&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="s"&gt;'Male'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;'Female'&lt;/span&gt;&lt;span class="p"&gt;]),&lt;/span&gt;
            &lt;span class="s"&gt;'City'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;random&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;choice&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="s"&gt;'New York'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;'Los Angeles'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;'Chicago'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;'Houston'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;'Miami'&lt;/span&gt;&lt;span class="p"&gt;]),&lt;/span&gt;
            &lt;span class="s"&gt;'Score'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;round&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;random&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;uniform&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;random&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;random&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mf"&gt;0.01&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="c1"&gt;# 1% chance to print
&lt;/span&gt;            &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;next&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fetch_spooky_quotes_goodreads&lt;/span&gt;&lt;span class="p"&gt;()))&lt;/span&gt;
        &lt;span class="k"&gt;yield&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;



&lt;span class="c1"&gt;# view data
&lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;generate_dummy_data&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# open connection
&lt;/span&gt;&lt;span class="n"&gt;pipeline&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;dlt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pipeline&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;destination&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;'duckdb'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;dataset_name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;'raw_data'&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Upsert/merge: Update old records, insert new
&lt;/span&gt;&lt;span class="n"&gt;load_info&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pipeline&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;write_disposition&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"merge"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;primary_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;table_name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"users"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

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

&lt;/div&gt;



</description>
      <category>python</category>
      <category>etl</category>
      <category>haloween</category>
    </item>
    <item>
      <title>How to run dbt from python, with dlt's core and cloud runners</title>
      <dc:creator>adrian</dc:creator>
      <pubDate>Fri, 27 Oct 2023 16:03:56 +0000</pubDate>
      <link>https://forem.com/dlt-library/how-to-run-dbt-from-python-with-dlts-core-and-cloud-runners-eff</link>
      <guid>https://forem.com/dlt-library/how-to-run-dbt-from-python-with-dlts-core-and-cloud-runners-eff</guid>
      <description>&lt;p&gt;We created open source dbt runners to enable easy running of dbt from python&lt;/p&gt;

&lt;p&gt;Here is the blog post about the use cases:&lt;br&gt;
&lt;a href="https://dlthub.com/docs/blog/dbt-runners-usage"&gt;dbt runners use cases&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here are the docs to use the 2 runners:&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://dlthub.com/docs/dlt-ecosystem/transformations/dbt/"&gt;dbt core runner&lt;/a&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Supports creating venv on the fly and installing dbt, copying the code and running the package in it.&lt;/li&gt;
&lt;li&gt;Supports passing credentials via dlt's credentials, which support also directly passing them in python.&lt;/li&gt;
&lt;li&gt;Can run code from local or public online repo.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://dlthub.com/docs/dlt-ecosystem/transformations/dbt/dbt_cloud"&gt;dbt cloud runner&lt;/a&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Supports starting an existing job and waiting for it to end&lt;/li&gt;
&lt;/ul&gt;

</description>
    </item>
    <item>
      <title>Podcast: Eliminate The Overhead In Your Data Integration With The Open Source dlt Library</title>
      <dc:creator>adrian</dc:creator>
      <pubDate>Fri, 27 Oct 2023 15:19:34 +0000</pubDate>
      <link>https://forem.com/dlt-library/podcast-eliminate-the-overhead-in-your-data-integration-with-the-open-source-dlt-library-4a6h</link>
      <guid>https://forem.com/dlt-library/podcast-eliminate-the-overhead-in-your-data-integration-with-the-open-source-dlt-library-4a6h</guid>
      <description>&lt;p&gt;Resharing the episode we did on Tobias Macey's data engineering podcast.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.dataengineeringpodcast.com/dlt-data-integration-library-episode-390"&gt;https://www.dataengineeringpodcast.com/dlt-data-integration-library-episode-390&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;dlt is an open-source Python library that allows you to load data from various and often messy data sources into well-structured, live datasets. &lt;/p&gt;

&lt;p&gt;It simplifies the process of data extraction, normalization, and loading, and can be easily integrated into your Python scripts. &lt;/p&gt;

&lt;p&gt;It's user-friendly, scalable, and can run wherever Python runs, making it a powerful tool for both beginners and senior professionals. &lt;/p&gt;

&lt;p&gt;You can install it with pip install dlt. For more details, check out the &lt;a href="https://dlthub.com/docs/intro"&gt;Introduction to dlt.&lt;/a&gt;&lt;/p&gt;

</description>
      <category>podcast</category>
      <category>dataengineering</category>
      <category>dlt</category>
      <category>opensource</category>
    </item>
    <item>
      <title>What can you expect from a hackernews launch?</title>
      <dc:creator>adrian</dc:creator>
      <pubDate>Fri, 27 Oct 2023 14:56:25 +0000</pubDate>
      <link>https://forem.com/dlt-library/what-can-you-expect-from-a-hackernews-launch-967</link>
      <guid>https://forem.com/dlt-library/what-can-you-expect-from-a-hackernews-launch-967</guid>
      <description>&lt;p&gt;So we launched our python library with a colab demo on hackernews and here's a short summary of what happened&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Post went to front page in the morning at 7:30 AM &lt;a href="https://news.ycombinator.com/item?id=37999527"&gt;https://news.ycombinator.com/item?id=37999527&lt;/a&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--rFpV9lea--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xvms4vus5lqk33wugbfr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--rFpV9lea--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xvms4vus5lqk33wugbfr.png" alt="2nd place!" width="800" height="209"&gt;&lt;/a&gt;&lt;br&gt;
Our post linked to a &lt;a href="https://colab.research.google.com/drive/1DhaKW0tiSTHDCVmPjM-eoyL47BJ30xmP#scrollTo=1wf1R0yQh7pv"&gt;colab demo&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Comments and visitors started coming in. We did our best to answer as the post slowly dropped off the main page. By 6 PM our time, the post already went off the first page and onto the second.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Outcomes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;we went from 520 git stars to 670+ over 48h, and they keep climbing at a slower rate&lt;/li&gt;
&lt;li&gt;Our github traffic was about 20x of a regular day &lt;/li&gt;
&lt;li&gt;Our website traffic was about 3x compared to a regular day&lt;/li&gt;
&lt;li&gt;about 10 new members joined our slack community.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>hackernews</category>
      <category>dlt</category>
      <category>opensource</category>
      <category>python</category>
    </item>
    <item>
      <title>6 judgment mistakes companies make when refusing data freelancers</title>
      <dc:creator>adrian</dc:creator>
      <pubDate>Fri, 27 Oct 2023 13:34:39 +0000</pubDate>
      <link>https://forem.com/dlt-library/6-judgment-mistakes-companies-make-when-refusing-data-freelancers-2pib</link>
      <guid>https://forem.com/dlt-library/6-judgment-mistakes-companies-make-when-refusing-data-freelancers-2pib</guid>
      <description>&lt;p&gt;I started dlthub as a freelancer, and I'll continue working with freelancers. &lt;/p&gt;

&lt;p&gt;My field of work was data engineering and you can find more info about it in this &lt;a href="https://datatalks.club/podcast/s09e04-freelancing-and-consulting-with-data-engineering.html" rel="noopener noreferrer"&gt;data talks podcast&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;However, I've noticed that some companies reject freelancers for reasons that may not be entirely justified.&lt;/p&gt;

&lt;p&gt;Have you or your company recently turned down a talented individual simply because they were a freelancer? Did you challenge that decision, or did you base it on the notion that "we only hire full-time employees"?&lt;/p&gt;

&lt;p&gt;Many of the companies I've spoken to are quick to dismiss freelancers as candidates for full-time positions. Often, this is due to a fundamental misunderstanding of what a freelancer represents.&lt;/p&gt;

&lt;p&gt;In the early days, when I was unsure about how to secure projects, I tried applying for full-time roles as a freelancer. More often than not, I was met with silence, which was a stark departure from the typical &amp;lt;24-hour response times I was accustomed to.&lt;/p&gt;

&lt;p&gt;I did receive callbacks from some of these companies, expressing interest in hiring me as an employee. However, they would only consider hiring me as a freelancer if they were unable to fill the role in time to meet their goals. This raised a question: why would these companies pass up the opportunity to bring in someone with precisely the skills they needed?&lt;/p&gt;

&lt;p&gt;So whenever a company told me that they don't hire freelancers, I took it as an opportunity to learn from the interaction and inquire about the reasons behind this decision. In some cases, I received rather confrontational responses, and these responses were often based on misconceptions.&lt;/p&gt;

&lt;h3&gt;
  
  
  Misconception 1: Freelancers are flaky.
&lt;/h3&gt;

&lt;p&gt;One common misconception is that freelancers are unreliable. Don't let stereotypes deter you; the people who believe this often lack direct experience working with freelancers.&lt;/p&gt;

&lt;p&gt;What does it mean to be "flaky" in a work context? I once had a colleague who was a full-time employee, and after being insulted by someone in management one day, he decided to resign via email and never returned to the office. Was he being flaky? I wouldn't describe it that way. He made a principled decision, even though it may not have been the most pleasant one.&lt;/p&gt;

&lt;p&gt;"Flaky" refers to someone who doesn't fulfill their work responsibilities. So, what motivates someone to deliver quality work?&lt;/p&gt;

&lt;p&gt;Consider this: a freelancer has less at stake compared to an employee. Their career isn't threatened by a neglectful manager, their hours aren't dictated by an overly demanding boss, and they aren't working for you out of necessity. Freelancers don't have notice periods, and they don't lose sleep over job security.&lt;/p&gt;

&lt;p&gt;Freelancers collaborate with you because they genuinely enjoy the work. They could likely earn similar or even better compensation elsewhere, but they choose to work with you because they are genuinely interested in seeing projects through.&lt;/p&gt;

&lt;p&gt;If an employee were to flake out on you, would a three-month notice period have made any difference? It didn't in the example mentioned earlier, and it didn't in the case of several employees I replaced as a freelancer, all of whom had left their positions in frustration.&lt;/p&gt;

&lt;p&gt;So, why do freelancers leave? Consider the possibility that a freelancer's departure is driven by their work environment. Could it be that an employee would have left much sooner, even with a notice period? It's essential to recognize that freelancers are less likely to be adversely affected by a challenging company culture, are more motivated to produce high-quality work, and are more likely to remain engaged. However, it's still a game of chance, as differing values and perspectives can gradually lead to parting ways.&lt;/p&gt;

&lt;h3&gt;
  
  
  Misconception 2: Freelancers are expensive. Market value for this work is X per hour.
&lt;/h3&gt;

&lt;p&gt;Another reason companies often give for not hiring freelancers is cost. They compare freelancer rates to average salaries and conclude that freelancers are too expensive.&lt;/p&gt;

&lt;p&gt;But just because the average salary for a role is X doesn't mean that the top talent you want to hire is willing to accept X. While some highly skilled individuals may not fully recognize their value and offer their services at the X rate, it doesn't mean you can retain top talent at that rate.&lt;/p&gt;

&lt;p&gt;What is a freelancer's value? A freelancer with experience in the market has likely encountered various challenges and gained expertise in solving them. They are hired to deliver value for money and bill you only for the work they perform.&lt;/p&gt;

&lt;p&gt;For example, consider a senior data employee you hired at a salary of 80,000. When you factor in company contributions to health, pension, hardware, and other benefits, this translates to a cost of about 100,000 to 110,000 to the company.&lt;/p&gt;

&lt;p&gt;For an employee with 30 days of vacation, this works out to be roughly 60 per hour. When you factor in sick days and management and hiring overhead distributed over the employee's tenure, the cost rises to just over 70 per hour.&lt;/p&gt;

&lt;p&gt;Now, let's look at an average senior data freelancer who charges around 80 to 100 per hour, with no additional costs beyond optional office space. Considering their short notice availability, self-management skills, lower risk to the employer, and additional experiences and skills that freelancers develop due to their work style, is +10-40% not worth it?&lt;/p&gt;

&lt;p&gt;Why 1-to-1 comparisons are wrong:&lt;br&gt;
Typically, hiring managers don't make these kinds of calculations, and they often compare their net/gross salary with the freelancer's total cost to the company, leading to the conclusion that freelancers are not worth it.&lt;/p&gt;

&lt;p&gt;Sometimes, employers look for a good deal on salary and discount freelancers right from the start.&lt;/p&gt;

&lt;p&gt;However, securing a "good deal" on salary can lead to situations that are detrimental to both parties. An underpaid employee may eventually leave once they realize they are undervalued. Alternatively, a junior employee may accept a low salary, which could result in a loss for the company if the cheaper but less experienced hire turns out to be five times slower. Moreover, junior employees may not have the appropriate environment to foster their professional growth.&lt;/p&gt;

&lt;p&gt;Junior talent is not cost-effective:&lt;br&gt;
Junior employees should not be seen merely as low-cost workhorses. They are, in fact, expensive professionals. Due to their limited experience, they are content with less complex tasks that provide exposure, learning opportunities, and practice without excessive pressure.&lt;/p&gt;

&lt;p&gt;While this arrangement can be beneficial if you already have specialists, as it allows them to focus on solving complex problems, it is not suitable if you require someone who can hit the ground running. Junior employees are typically slower at handling straightforward tasks because they are still learning, which drives up the cost per unit of work.&lt;/p&gt;

&lt;p&gt;Who would professionals prefer to hire?&lt;br&gt;
If you ask any successful freelancer, they will tell you that they prefer to hire another freelancer or a well-compensated senior employee as their assistant. Freelancers tend to avoid hiring less experienced individuals due to the challenges of onboarding and managing such hires, and because no one wants to deal with an underpaid and thus demotivated employee. Such an arrangement is likely to harm client relations.&lt;/p&gt;

&lt;p&gt;In fact, a former manager of mine, who was both a serial founder and a freelancer, shared their perspective on this matter. They always leaned toward hiring a freelancer for data-related roles because it provided higher value for their investment.&lt;/p&gt;

&lt;p&gt;Can't I just hire multiple juniors?&lt;br&gt;
You might think that hiring several junior employees could compensate for their lower productivity. However, it's important to remember that adding more team members doesn't always lead to improved overall performance. As a general rule, once a team exceeds five members, adding more members typically doesn't result in improved productivity. This is due to communication overhead, reduced accountability, and the emergence of free riders.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2Fp5iejj8mpisfnr09glpj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fp5iejj8mpisfnr09glpj.png" alt="Exponential communication line growth in a growing team. Allow direct decisions to reduce communication overhead. Reference – Stack overflow page that no longer exists"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Of course, if you have an efficient process in place, you can expand your team size while minimizing cross-communication overhead.&lt;/p&gt;

&lt;p&gt;So, who should you hire for the job? The answer is clear: hire the best talent you can find. A more experienced, motivated, and autonomous freelancer is often a more cost-effective choice for getting the job done. Freelancers get paid for results, not for the time spent. While hours are used for quantification, at the end of the month, hiring managers assess the output, not the hours worked.&lt;/p&gt;

&lt;p&gt;Next time you, as an employee or hiring manager, question whether the cost-to-value ratio of freelancers is a concern, reconsider your stance.&lt;/p&gt;

&lt;p&gt;These are just a few of the misconceptions surrounding freelancers, and there are more to explore. In the following sections, we will address additional misconceptions and provide a well-rounded understanding of the benefits freelancers can bring to your organization.&lt;/p&gt;

&lt;h3&gt;
  
  
  Misconception 3: 'Freelancers are only for short projects'
&lt;/h3&gt;

&lt;p&gt;It's a common mistake to assume that hiring a freelancer is primarily beneficial for short-term, one-time projects. While freelancers do excel in these situations due to their availability and competence, this doesn't mean they are limited to such scenarios.&lt;/p&gt;

&lt;p&gt;Imagine you possess a magical cannon that generates millions of dollars in value for your company annually, with a cost of only 15,000 per "cannonball" (project). Now, let's say that building a complete data warehouse with reporting requires two "cannonballs." What if assembling a team necessitates three "cannonballs"? And creating a continuous improvement framework for a CRM involves another three "cannonballs." In such cases, wouldn't you want to secure a few more "cannonballs" (i.e., hire the same freelancer repeatedly for multiple projects or an extended duration)? This approach makes sense, given the substantial value a freelancer brings.&lt;/p&gt;

&lt;p&gt;Freelancers are professionals who thrive on learning and growth. They have a growth mindset and the ability to enhance nearly any aspect of your organization, regardless of the specific domain. They possess the capability to optimize processes and solve problems efficiently. They are the ones who might bring you those coveted 2x multipliers.&lt;/p&gt;

&lt;p&gt;Once you recognize the return on investment (ROI) of hiring a data freelancer, you'll understand why it makes sense to work with them for longer than just short projects.&lt;/p&gt;

&lt;h3&gt;
  
  
  Misconception 4: 'We need full-time help'
&lt;/h3&gt;

&lt;p&gt;Many companies mistakenly believe that hiring a freelancer precludes them from obtaining full-time assistance. This is a misconception; you can indeed have full-time support from a freelancer.&lt;/p&gt;

&lt;p&gt;In Germany, a law exists to prevent companies from hiring freelancers full-time to reduce social security costs. However, it is not uncommon to see freelancers working with a single client for 18-month stretches on a full-time basis or for years on a part-time basis. This is completely legal and compliant with the law, as long as the proper criteria are met. It's a matter of doing due diligence.&lt;/p&gt;

&lt;p&gt;In reality, full-time help from a freelancer is entirely possible. Companies that insist otherwise, despite knowing better, may simply desire control over an employee's time. A relationship driven by insecurity rarely turns out well in the long run.&lt;/p&gt;

&lt;p&gt;A fear-driven client may not share the same values as a freelancer with a growth mindset. Both perspectives are valid, but one is more likely to propel your organization forward while the other may hinder progress. Not everyone aspires to run a large business, and there are legitimate reasons for preferring a smaller operation.&lt;/p&gt;

&lt;h3&gt;
  
  
  Misconception 5: 'We want someone focused on working with us, not distracted by other clients'
&lt;/h3&gt;

&lt;p&gt;Many companies express concerns that a freelancer may juggle multiple clients simultaneously, which could dilute their focus and capacity.&lt;/p&gt;

&lt;p&gt;At first glance, this concern seems reasonable. However, there are two key reasons why it may not be as significant as it appears.&lt;/p&gt;

&lt;p&gt;Freelancers are less distracted than your employees: While working as an employee, I often interviewed with other companies. I believed this was an excellent way to stay informed about the job market, industry trends, and various approaches taken by other teams. It also allowed me to gauge my market value as an employee.&lt;/p&gt;

&lt;p&gt;Working for startups as an employee often meant receiving lowball salary offers. Naturally, these offers were distracting and made me question if my time would be better spent elsewhere. Do I receive similar offers as a freelancer? Absolutely. However, these offers are less distracting.&lt;/p&gt;

&lt;p&gt;As a freelancer, I was often fully booked at competitive rates. I choose the projects I work on and am 100% focused on them because it's my choice to be there. I have no desire to work elsewhere, and I don't believe the grass is greener on the other side. If it were, I would already be there.&lt;/p&gt;

&lt;p&gt;In summary, freelancers are less susceptible to distractions compared to employees. Their focused commitment to delivering quality work is often unwavering.&lt;/p&gt;

&lt;p&gt;You profit from a freelancer's multiple clients: Having other clients beside you can actually benefit your organization. Every experienced freelancer will tell you that there are constant synergies between projects. They learn something new on one project one day and implement it on another client's project the next.&lt;/p&gt;

&lt;p&gt;The fact that your potential freelancer has other clients means they are in high demand as skilled professionals, and they're rapidly expanding their knowledge. Your company can leverage this wealth of experience and knowledge to its advantage.&lt;/p&gt;

&lt;h3&gt;
  
  
  Misconception 6: 'We want to keep the knowledge in-house'
&lt;/h3&gt;

&lt;p&gt;It's a common concern for companies that hiring a freelancer might result in losing the knowledge acquired during a project. There's often a fear that a freelancer will depart, leaving the company without anyone who understands the insights gained.&lt;/p&gt;

&lt;p&gt;However, this perspective is flawed on several fronts.&lt;/p&gt;

&lt;p&gt;Knowledge that doesn't lead to action is often not valuable: Not all knowledge needs to be retained. Information that doesn't translate into practical applications isn't useful. It's vital to prioritize applying and integrating acquired knowledge into your operations rather than merely cataloging it.&lt;/p&gt;

&lt;p&gt;It's not the role of freelancers or employees to store knowledge: Storing knowledge is not the responsibility of individuals; it's the role of documentation repositories, automated workflows, and efficient processes. Relying on humans to serve as repositories for knowledge reflects a lack of clarity and efficiency in your organizational processes. The goal is to use people to drive improvements and innovation.&lt;/p&gt;

&lt;p&gt;Freelancers excel at driving improvement: Employees who remain in a single role for an extended period often become stagnant. Their exposure to new ideas and experiences diminishes, resulting in limited growth. While employees retain knowledge, they might not actively contribute to ongoing improvements.&lt;/p&gt;

&lt;p&gt;Freelancers, on the other hand, are continuously engaged with the broader professional landscape. They are typically brought in to drive improvements and optimize processes. Their work centers on enhancing performance, which aligns with their growth mindset.&lt;/p&gt;

&lt;p&gt;By leveraging a data freelancer for research and development, you can still access the research findings without investing time in discovery. In some cases, a freelancer might not need to engage in research and development activities because they can apply knowledge gained from previous projects.&lt;/p&gt;

&lt;h3&gt;
  
  
  In conclusion
&lt;/h3&gt;

&lt;p&gt;Don't let these misconceptions deter you from recognizing and harnessing the incredible value that freelancers can bring to your organization. Freelancers can be valuable assets for both short-term and long-term endeavors, and they are motivated to deliver exceptional results. Furthermore, they can offer unique insights and perspectives, enriching your organization with their multifaceted experiences. The next time you hesitate to engage a freelancer, it's essential to reassess and consider the full spectrum of advantages they bring.&lt;/p&gt;

</description>
      <category>freelance</category>
      <category>dataengineering</category>
      <category>data</category>
      <category>consulting</category>
    </item>
    <item>
      <title>From local to cloud with a flip of a switch - Load Ga4-&gt;DuckDB (MDS in a box) or go to the cloud in MotherDuck</title>
      <dc:creator>adrian</dc:creator>
      <pubDate>Fri, 27 Oct 2023 12:38:01 +0000</pubDate>
      <link>https://forem.com/dlt-library/from-local-to-cloud-with-a-flip-of-a-switch-load-ga4-duckdb-mds-in-a-box-or-go-to-the-cloud-in-motherduck-1o5c</link>
      <guid>https://forem.com/dlt-library/from-local-to-cloud-with-a-flip-of-a-switch-load-ga4-duckdb-mds-in-a-box-or-go-to-the-cloud-in-motherduck-1o5c</guid>
      <description>&lt;p&gt;In this article, our working student Rahul is showing us how simple it is to pull Google Analytics 4 data with dlt and put the data in DuckDB.&lt;/p&gt;

&lt;p&gt;He uses dbt to transform and visualises the data with Metabase. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--vcXcCsYN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/z9d5kfbuq15oifx19neu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--vcXcCsYN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/z9d5kfbuq15oifx19neu.png" alt="Local for personal use" width="800" height="510"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Finally, good things should be shared, so he plays with the idea of going outside of the Box and onto the cloud so he is able to serve the results of the work to stakeholders.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--R2DIZNIG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/61lhpfu2yrmancjjvp6f.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--R2DIZNIG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/61lhpfu2yrmancjjvp6f.png" alt="Cloud for serving to company" width="800" height="504"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Code and video included.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dlthub.com/docs/blog/dlt-motherduck-demo"&gt;Read about it here!&lt;/a&gt;&lt;/p&gt;

</description>
      <category>duckdb</category>
      <category>dataengineering</category>
      <category>python</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Transfer SQL-&gt; analytics 30x faster with ConnectorX + arrow + dlt</title>
      <dc:creator>adrian</dc:creator>
      <pubDate>Fri, 27 Oct 2023 10:58:07 +0000</pubDate>
      <link>https://forem.com/dlt-library/transfer-sql-analytics-30x-faster-with-connectorx-arrow-dlt-29l4</link>
      <guid>https://forem.com/dlt-library/transfer-sql-analytics-30x-faster-with-connectorx-arrow-dlt-29l4</guid>
      <description>&lt;p&gt;&lt;a href="https://media.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%2Fux211dbncgg5e6ph8uz9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fux211dbncgg5e6ph8uz9.png" alt="ConnectorX + Arrow + dlt"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;dlt is a recently released python library for data extraction and loading, the EL in ETL. At dltHub we are big fans of optimising things and integrating those optimisations into our toolkit to enable others to re-use them.&lt;/p&gt;

&lt;h3&gt;
  
  
  Speed boosts and schema from arrow, dlt for loading with schema evolution
&lt;/h3&gt;

&lt;p&gt;In this example, we combine ConnectorX + Arrow + dlt to extract data and load it to a strongly typed environment 30x faster than classic data transfer via sqlalchemy.&lt;/p&gt;

&lt;h3&gt;
  
  
  Result: Much faster, but mind the memory usage
&lt;/h3&gt;

&lt;p&gt;In this example we can see 30x overall speedup on extraction and normalisation with Arrow The process took 16 seconds with arrow vs 8 minutes with sqlalchemy + dlt's JSON normaliser for 10m rows.&lt;/p&gt;

&lt;p&gt;The output in both of methods is the same (parquet files or loaded data) with schema evolution. However, in the case of arrow, we are not iterating row by row, so we cannot perform optimisations we can while streaming from sqlalchemy, such as microbatching to keep memory use low.&lt;/p&gt;

&lt;p&gt;Read more about it + implementation docs on our &lt;a href="https://dlthub.com/docs/blog/dlt-arrow-loading" rel="noopener noreferrer"&gt;blog here&lt;/a&gt;&lt;/p&gt;

</description>
      <category>dataengineering</category>
      <category>python</category>
      <category>arrow</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
