<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Data Engineering on App Coding</title>
    <link>https://appcoding.com/tags/data-engineering/</link>
    <description>Recent content in Data Engineering on App Coding</description>
    <generator>Hugo</generator>
    <language>en-us</language>
    <lastBuildDate>Mon, 05 Oct 2026 00:00:00 +0000</lastBuildDate>
    <atom:link href="https://appcoding.com/tags/data-engineering/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>A Database Where Every Value Remembers Its Source, Confidence and Extraction Time</title>
      <link>https://appcoding.com/a-database-where-every-value-remembers-its-source-confidence-and-extraction-time/</link>
      <pubDate>Mon, 05 Oct 2026 00:00:00 +0000</pubDate>
      <guid>https://appcoding.com/a-database-where-every-value-remembers-its-source-confidence-and-extraction-time/</guid>
      <description>&lt;p&gt;Somebody pastes a population figure into a shared spreadsheet: 1,234,567. It might have come from a census table, a Wikipedia infobox, a city press release or a model&amp;rsquo;s summary of one of those, and three weeks later nobody can say which. The paste kept the digits. Everything that made them believable stayed in a browser tab that closed long ago.&lt;/p&gt;&#xA;&lt;p&gt;A value without provenance is a rumor with a data type.&lt;/p&gt;</description>
    </item>
    <item>
      <title>A Telemetry Database That Forgets on Purpose Keeps Rollups and Anomalies Instead of Raw Rows</title>
      <link>https://appcoding.com/a-telemetry-database-that-forgets-on-purpose-keeps-rollups-and-anomalies-instead-of-raw-rows/</link>
      <pubDate>Mon, 05 Oct 2026 00:00:00 +0000</pubDate>
      <guid>https://appcoding.com/a-telemetry-database-that-forgets-on-purpose-keeps-rollups-and-anomalies-instead-of-raw-rows/</guid>
      <description>&lt;p&gt;At 300 requests a second, one latency metric adds about 26 million rows a day. Nobody will read most of them again. What people ask for a month later is the p99 per route for last Tuesday, and the one request that took nine seconds. A rule that deletes rows after 30 days throws away both answers. Keeping every row forever pays storage bills for data nobody reads.&lt;/p&gt;&#xA;&lt;p&gt;The telemetry store worth building decides at write time what has to survive. It folds everything else into coarser buckets on a schedule and keeps the few raw events that carry information, whole. Forgetting becomes part of the schema, declared in a policy, instead of a cron job that deletes by age. This is the argument for &lt;a href=&#34;https://apicoding.com/the-best-small-infrastructure-tools-reduce-data-near-the-source-instead-of-storing-more/&#34;&gt;reducing data near the source&lt;/a&gt;, applied to time series.&lt;/p&gt;</description>
    </item>
    <item>
      <title>A Tiny SQL Engine for JSON Streams Fits Between jq and a Stream Processing Cluster</title>
      <link>https://appcoding.com/a-tiny-sql-engine-for-json-streams-fits-between-jq-and-a-stream-processing-cluster/</link>
      <pubDate>Mon, 05 Oct 2026 00:00:00 +0000</pubDate>
      <guid>https://appcoding.com/a-tiny-sql-engine-for-json-streams-fits-between-jq-and-a-stream-processing-cluster/</guid>
      <description>&lt;p&gt;Your service writes one JSON object per line to stdout, and you want the average &lt;code&gt;cpu&lt;/code&gt; for host &lt;code&gt;web-3&lt;/code&gt; over the last five minutes. jq can&amp;rsquo;t answer that, because it forgets each object once it has printed it and has no idea what &amp;ldquo;five minutes&amp;rdquo; means. You can fake both with &lt;code&gt;jq -n &#39;reduce inputs as $e (...)&#39;&lt;/code&gt; plus a timestamp comparison, and you&amp;rsquo;ll have a script nobody wants to touch twice. DuckDB answers the question in one line, but only against a file as it exists right now. ksqlDB, Materialize, RisingWave, Arroyo and Flink SQL answer it continuously, once you&amp;rsquo;ve deployed a service and agreed to operate it.&lt;/p&gt;</description>
    </item>
    <item>
      <title>An Embedded Sketch Database: Billions of Events, Megabytes of Storage, Error Bars on Every Answer</title>
      <link>https://appcoding.com/an-embedded-sketch-database-billions-of-events-megabytes-of-storage-error-bars-on-every-answer/</link>
      <pubDate>Mon, 05 Oct 2026 00:00:00 +0000</pubDate>
      <guid>https://appcoding.com/an-embedded-sketch-database-billions-of-events-megabytes-of-storage-error-bars-on-every-answer/</guid>
      <description>&lt;p&gt;Counting unique visitors exactly means remembering every visitor. Say 6 million distinct IPv4 addresses hit a checkout service today. Packed at 4 bytes each, that set is 24 MB before any hash table overhead, and you need one per service, per region, per day you want to compare. Redis answers the same question with a HyperLogLog in about 12 KB per key, at a standard error of about 0.81%.&lt;/p&gt;&#xA;&lt;p&gt;The thin part is the database around it: a SQLite-shaped file of sketches with time buckets, rollups and a SQL front door (check before you start; this space moves). The version worth building stores nothing but mergeable sketches, grouped by dimension and time bucket, and every aggregate returns its error bound next to the value. You never keep the events. It&amp;rsquo;s the extreme case of &lt;a href=&#34;https://apicoding.com/the-best-small-infrastructure-tools-reduce-data-near-the-source-instead-of-storing-more/&#34;&gt;reducing data near the source&lt;/a&gt;: keep the answer, drop the rows.&lt;/p&gt;</description>
    </item>
    <item>
      <title>An Evidence Graph Built From Extracted Claims Keeps Contradictions Attached to Their Sources</title>
      <link>https://appcoding.com/an-evidence-graph-built-from-extracted-claims-keeps-contradictions-attached-to-their-sources/</link>
      <pubDate>Mon, 05 Oct 2026 00:00:00 +0000</pubDate>
      <guid>https://appcoding.com/an-evidence-graph-built-from-extracted-claims-keeps-contradictions-attached-to-their-sources/</guid>
      <description>&lt;p&gt;Feed forty articles about a rumored plant restart to a summarizer and you get one smooth paragraph: several outlets report that production will resume in March, though the ministry has pushed back. It reads well. It also throws away what you&amp;rsquo;d need to act on it. You can&amp;rsquo;t tell which outlets reported it, whether each had its own source or all copied one wire story, or what the ministry actually said, a denial or a polite refusal to comment.&lt;/p&gt;</description>
    </item>
    <item>
      <title>DuckDB Already Queries Every File in a Folder, So Build the Part That Infers the Joins</title>
      <link>https://appcoding.com/duckdb-already-queries-every-file-in-a-folder-so-build-the-part-that-infers-the-joins/</link>
      <pubDate>Mon, 05 Oct 2026 00:00:00 +0000</pubDate>
      <guid>https://appcoding.com/duckdb-already-queries-every-file-in-a-folder-so-build-the-part-that-infers-the-joins/</guid>
      <description>&lt;p&gt;Someone hands you a zip: &lt;code&gt;customers.csv&lt;/code&gt; from the CRM, a JSON dump from the billing API, and a SQLite file from an internal app nobody has touched in two years. DuckDB will make all three queryable in a few lines of SQL, with no import step (&lt;code&gt;SELECT * FROM &#39;customers.csv&#39;&lt;/code&gt; works as written). Then you spend the afternoon working out which column joins to which. The CRM says &lt;code&gt;customer_id&lt;/code&gt; and stores &lt;code&gt;00123&lt;/code&gt;. The billing API says &lt;code&gt;customerId&lt;/code&gt; and stores &lt;code&gt;123&lt;/code&gt;. The SQLite table has a column called &lt;code&gt;customer&lt;/code&gt; holding the text &lt;code&gt;123&lt;/code&gt;. Same customer, three spellings.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Facts Should Expire: A Database That Tells an AI Agent When Its Knowledge Has Gone Stale</title>
      <link>https://appcoding.com/facts-should-expire-a-database-that-tells-an-ai-agent-when-its-knowledge-has-gone-stale/</link>
      <pubDate>Mon, 05 Oct 2026 00:00:00 +0000</pubDate>
      <guid>https://appcoding.com/facts-should-expire-a-database-that-tells-an-ai-agent-when-its-knowledge-has-gone-stale/</guid>
      <description>&lt;p&gt;An agent keeps a memory table, and two rows matter for today&amp;rsquo;s task: a supplier&amp;rsquo;s headquarters city, written eleven months ago, and a freight quote, written three hours ago. A &lt;code&gt;SELECT&lt;/code&gt; returns both in the same shape. The headquarters is probably still right. The quote may already be wrong. Nothing in either row says so, and the agent repeats both in the same flat tone.&lt;/p&gt;&#xA;&lt;p&gt;A row has no idea how old its truth is. It might carry a &lt;code&gt;created_at&lt;/code&gt;, and a careful person can compute an age from it, but the decay rate belongs to the kind of fact, not to the table. A three-week-old headquarters address is fine. A three-week-old shipping rate is fiction. Server health goes bad in half a minute. No timestamp column holds that knowledge, and nothing forces a query to read it anyway.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Incremental View Maintenance Small Enough to Embed Turns Dashboard Queries Into Lookups</title>
      <link>https://appcoding.com/incremental-view-maintenance-small-enough-to-embed-turns-dashboard-queries-into-lookups/</link>
      <pubDate>Mon, 05 Oct 2026 00:00:00 +0000</pubDate>
      <guid>https://appcoding.com/incremental-view-maintenance-small-enough-to-embed-turns-dashboard-queries-into-lookups/</guid>
      <description>&lt;p&gt;A dashboard tile shows today&amp;rsquo;s US traffic, so every page load runs &lt;code&gt;SELECT count(*) FROM events WHERE country = &#39;US&#39;&lt;/code&gt; over a table that grew by a few hundred thousand rows since yesterday. SQLite answers correctly. It also walks every matching index entry to do it, because its b-trees don&amp;rsquo;t keep counts, and it does the same walk for the next viewer and the one after. Between two page loads the answer moves by a handful of rows, yet each load pays for all of them.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Kafka for One Machine: An Embedded Event Log With Offsets, Compaction and No Broker</title>
      <link>https://appcoding.com/kafka-for-one-machine-an-embedded-event-log-with-offsets-compaction-and-no-broker/</link>
      <pubDate>Mon, 05 Oct 2026 00:00:00 +0000</pubDate>
      <guid>https://appcoding.com/kafka-for-one-machine-an-embedded-event-log-with-offsets-compaction-and-no-broker/</guid>
      <description>&lt;p&gt;A desktop app wants an undo history that survives a crash. An edge gateway buffers sensor readings while its uplink is down and has to replay them, in order, once the link is back. An AI agent writes down every action it takes so a bad run can be replayed later. All three are the same data structure: an append-only sequence of records, plus readers that remember where they stopped. Kafka is that structure, and also a cluster, partitions and the people who tune them.&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
