SlideShare a Scribd company logo
Streaming SQL
Julian Hyde
Apache Samza meetup
Mountain View, CA
2016/2/17
@julianhyde
SQL
Query planning
Query federation
OLAP
Streaming
Hadoop
Thanks to Milinda Pathirage for his work on samza-
sql and the design of streaming SQL
Why SQL? ● API to your database
● Ask for what you want,
system decides how to get it
● Query planner (optimizer)
converts logical queries to
physical plans
● Mathematically sound
language (relational algebra)
● For all data, not just data in a
database
● Opportunity for novel data
organizations & algorithms
● Standard
https://www.flickr.com/photos/pere/523019984/ (CC BY-NC-SA 2.0)
➢ API to your database
➢ Ask for what you want,
system decides how to get it
➢ Query planner (optimizer)
converts logical queries to
physical plans
➢ Mathematically sound
language (relational algebra)
➢ For all data, not just “flat”
data in a database
➢ Opportunity for novel data
organizations & algorithms
➢ Standard
Why SQL?
How much is your data worth?
Recent data is more valuable
➢ ...if you act on it in time
Data moves from expensive
memory to cheaper disk as it cools
Old + new data is more valuable
still
➢ ...if we have a means to
combine them
Time
Value of
data ($/B)
Now1 hour
ago
1 day
ago
1 week
ago
1 year
ago
Simple queries
select *
from Products
where unitPrice < 20
select stream *
from Orders
where units > 1000
➢ Traditional (non-streaming)
➢ Products is a table
➢ Retrieves records from -∞ to now
➢ Streaming
➢ Orders is a stream
➢ Retrieves records from now to +∞
➢ Query never terminates
Stream-table duality
select *
from Orders
where units > 1000
➢ Yes, you can use a stream as
a table
➢ And you can use a table as a
stream
➢ Actually, Orders is both
➢ Use the stream keyword
➢ Where to actually find the
data? That’s up to the system
select stream *
from Orders
where units > 1000
Combining past and future
select stream *
from Orders as o
where units > (
select avg(units)
from Orders as h
where h.productId = o.productId
and h.rowtime > o.rowtime - interval ‘1’ year)
➢ Orders is used as both stream and table
➢ System determines where to find the records
➢ Query is invalid if records are not available
The “pie chart” problem
➢ Task: Write a web page summarizing
orders over the last hour
➢ Problem: The Orders stream only
contains the current few records
➢ Solution: Materialize short-term history
Orders over the last hour
Beer
48%
Cheese
30%
Wine
22%
select productId, count(*)
from Orders
where rowtime > current_timestamp - interval ‘1’ hour
group by productId
Aggregation and windows
on streams
GROUP BY aggregates multiple rows into sub-
totals
➢ In regular GROUP BY each row contributes
to exactly one sub-total
➢ In multi-GROUP BY (e.g. HOP, GROUPING
SETS) a row can contribute to more than
one sub-total
Window functions leave the number of rows
unchanged, but compute extra expressions for
each row (based on neighboring rows)
Multi
GROUP BY
Window
functions
GROUP BY
GROUP BY select stream productId,
floor(rowtime to hour) as rowtime,
sum(units) as u,
count(*) as c
from Orders
group by productId,
floor(rowtime to hour)
rowtime productId units
09:12 100 5
09:25 130 10
09:59 100 3
10:00 100 19
11:05 130 20
rowtime productId u c
09:00 100 8 2
09:00 130 10 1
10:00 100 19 1
not emitted yet; waiting
for a row >= 12:00
When are rows emitted?
The replay principle:
A streaming query produces the same result as the corresponding non-
streaming query would if given the same data in a table.
Output must not rely on implicit information (arrival order, arrival time,
processing time, or punctuations)
Making progress
It’s not enough to get the right result. We
need to give the right result at the right
time.
Ways to make progress without
compromising safety:
➢ Monotonic columns (e.g. rowtime)
and expressions (e.g. floor
(rowtime to hour))
➢ Punctuations (aka watermarks)
➢ Or a combination of both
select stream productId,
count(*) as c
from Orders
group by productId;
ERROR: Streaming aggregation
requires at least one
monotonic expression in
GROUP BY clause
Window types
➢ Tumbling window: “Every T seconds, emit the total for T seconds”
➢ Hopping window: “Every T seconds, emit the total for T2 seconds”
➢
➢ Sliding window: “Every record, emit the total for the surrounding T seconds”
or “Every record, emit the total for the surrounding T records” (see next slide…)
select … from Orders group by floor(rowtime to hour)
select … from Orders
group by tumble(rowtime, interval ‘1’ hour)
select stream … from Orders
group by hop(rowtime, interval ‘1’ hour, interval ‘2’ hour)
Window functions
select stream sum(units) over w as units1h,
sum(units) over w (partition by productId) as units1hp,
rowtime, productId, units
from Orders
window w as (order by rowtime range interval ‘1’ hour preceding)
rowtime productId units
09:12 100 5
09:25 130 10
09:59 100 3
10:17 100 10
units1h units1hp rowtime productId units
5 5 09:12 100 5
15 10 09:25 130 10
18 8 09:59 100 3
23 13 10:17 100 10
Join stream to a table
Inputs are the Orders stream and the
Products table, output is a stream.
Acts as a “lookup”.
Execute by caching the table in a hash-
map (if table is not too large) and
stream order will be preserved.
select stream *
from Orders as o
join Products as p
on o.productId = p.productId
Join stream to a changing table
Execution is more difficult if the
Products table is being changed
while the query executes.
To do things properly (e.g. to get the
same results when we re-play the
data), we’d need temporal database
semantics.
(Sometimes doing things properly is
too expensive.)
select stream *
from Orders as o
join Products as p
on o.productId = p.productId
and o.rowtime
between p.startEffectiveDate
and p.endEffectiveDate
Join stream to a stream
We can join streams if the join
condition forces them into “lock
step”, within a window (in this case,
1 hour).
Which stream to put input a hash
table? It depends on relative rates,
outer joins, and how we’d like the
output sorted.
select stream *
from Orders as o
join Shipments as s
on o.productId = p.productId
and s.rowtime
between o.rowtime
and o.rowtime + interval ‘1’ hour
Planning queries
MySQL
Splunk
join
Key: productId
group
Key: productName
Agg: count
filter
Condition:
action = 'purchase'
sort
Key: c desc
scan
scan
Table: products
select p.productName, count(*) as c
from splunk.splunk as s
join mysql.products as p
on s.productId = p.productId
where s.action = 'purchase'
group by p.productName
order by c desc
Table: splunk
Optimized query
MySQL
Splunk
join
Key: productId
group
Key: productName
Agg: count
filter
Condition:
action = 'purchase'
sort
Key: c desc
scan
scan
Table: splunk
Table: products
select p.productName, count(*) as c
from splunk.splunk as s
join mysql.products as p
on s.productId = p.productId
where s.action = 'purchase'
group by p.productName
order by c desc
Apache Calcite
Apache top-level project since October, 2015
Query planning framework
➢ Relational algebra, rewrite rules
➢ Cost model & statistics
➢ Federation via adapters
➢ Extensible
Packaging
➢ Library
➢ Optional SQL parser, JDBC server
➢ Community-authored rules, adapters
Embedded Adapters Streaming
Apache Drill
Apache Hive
Apache Kylin
Apache Phoenix*
Cascading
Lingual
Apache
Cassandra*
Apache Spark
CSV
In-memory
JDBC
JSON
MongoDB
Splunk
Web tables
Apache Flink*
Apache Samza
Apache Storm
* Under development
Architecture
Conventional database Calcite
Relational algebra (plus streaming)
Core operators:
➢ Scan
➢ Filter
➢ Project
➢ Join
➢ Sort
➢ Aggregate
➢ Union
➢ Values
Streaming operators:
➢ Delta (converts relation to
stream)
➢ Chi (converts stream to
relation)
In SQL, the STREAM keyword
signifies Delta
Optimizing streaming queries
The usual relational transformations still apply: push filters and projects towards
sources, eliminate empty inputs, etc.
The transformations for delta are mostly simple:
➢ Delta(Filter(r, predicate)) → Filter(Delta(r), predicate)
➢ Delta(Project(r, e0, ...)) → Project(Delta(r), e0, …)
➢ Delta(Union(r0, r1), ALL) → Union(Delta(r0), Delta(r1))
But not always:
➢ Delta(Join(r0, r1, predicate)) → Union(Join(r0, Delta(r1)), Join(Delta(r0), r1)
➢ Delta(Scan(aTable)) → Empty
ORDER BY
Sorting a streaming query is valid as long as the system can make
progress.
select stream productId,
floor(rowtime to hour) as rowtime,
sum(units) as u,
count(*) as c
from Orders
group by productId,
floor(rowtime to hour)
order by rowtime, c desc
Union
As in a typical database, we rewrite x union y
to select distinct * from (x union all y)
We can implement x union all y by simply combining the inputs in arrival
order but output is no longer monotonic. Monotonicity is too useful to squander!
To preserve monotonicity, we merge on the sort key (e.g. rowtime).
DML
➢ View & standing INSERT give same
results
➢ Useful for chained transforms
➢ But internals are different
insert into LargeOrders
select stream * from Orders
where units > 1000
create view LargeOrders as
select stream * from Orders
where units > 1000
upsert into OrdersSummary
select stream productId,
count(*) over lastHour as c
from Orders
window lastHour as (
partition by productId
order by rowtime
range interval ‘1’ hour preceding)
Use DML to maintain a “window”
(materialized stream history).
Summary: Streaming SQL features
Standard SQL over streams and relations
Streaming queries on relations, and relational queries on streams
Joins between stream-stream and stream-relation
Queries are valid if the system can get the data, with a reasonable latency
➢ Monotonic columns and punctuation are ways to achieve this
Views, materialized views and standing queries
Summary: The benefits of streaming SQL
High-level language lets the system optimize quality of service (QoS) and data
location
Give existing tools and traditional users to access streaming data
Combine streaming and historic data
Streaming SQL is a superset of standard SQL
Discussion continues at Apache Calcite, with contributions from Samza, Flink,
Storm and others. (Please join in!)
Thank you!
@julianhyde
@ApacheCalcite
http://calcite.apache.org
http://calcite.apache.org/docs/stream.html
“Data in Flight”, Communications of the ACM, January 2010 [article]
[SAMZA-390] High-level language for SAMZA

More Related Content

PDF
Easy, scalable, fault tolerant stream processing with structured streaming - ...
PDF
Deep dive into stateful stream processing in structured streaming by Tathaga...
PDF
Deep Dive into Stateful Stream Processing in Structured Streaming with Tathag...
PDF
Vectorized Query Execution in Apache Spark at Facebook
PDF
MongoDB Sharding Fundamentals
PDF
Streaming SQL with Apache Calcite
PDF
Kafka Streams State Stores Being Persistent
PPTX
Rds data lake @ Robinhood
Easy, scalable, fault tolerant stream processing with structured streaming - ...
Deep dive into stateful stream processing in structured streaming by Tathaga...
Deep Dive into Stateful Stream Processing in Structured Streaming with Tathag...
Vectorized Query Execution in Apache Spark at Facebook
MongoDB Sharding Fundamentals
Streaming SQL with Apache Calcite
Kafka Streams State Stores Being Persistent
Rds data lake @ Robinhood

What's hot (20)

PDF
SQL for NoSQL and how Apache Calcite can help
PDF
Spark streaming , Spark SQL
PPTX
Sub query example with advantage and disadvantages
PDF
Hive Bucketing in Apache Spark with Tejas Patil
PDF
Apache Calcite (a tutorial given at BOSS '21)
PPTX
Apache Calcite overview
PPTX
Spark SQL Tutorial | Spark SQL Using Scala | Apache Spark Tutorial For Beginn...
PDF
Apache Calcite: A Foundational Framework for Optimized Query Processing Over ...
PPTX
File Format Benchmark - Avro, JSON, ORC & Parquet
PDF
Designing ETL Pipelines with Structured Streaming and Delta Lake—How to Archi...
PDF
A Deep Dive into Stateful Stream Processing in Structured Streaming with Tath...
PPTX
A Deep Dive into Spark SQL's Catalyst Optimizer with Yin Huai
PPT
Hashing PPT
PPTX
Context free grammar
PDF
From Query Plan to Query Performance: Supercharging your Apache Spark Queries...
PDF
AI made easy with Flink AI Flow
PPTX
Cost-based query optimization in Apache Hive 0.14
PDF
Cost-Based Optimizer Framework for Spark SQL: Spark Summit East talk by Ron H...
PDF
Performant Streaming in Production: Preventing Common Pitfalls when Productio...
ODP
Introduction to Structured Streaming
SQL for NoSQL and how Apache Calcite can help
Spark streaming , Spark SQL
Sub query example with advantage and disadvantages
Hive Bucketing in Apache Spark with Tejas Patil
Apache Calcite (a tutorial given at BOSS '21)
Apache Calcite overview
Spark SQL Tutorial | Spark SQL Using Scala | Apache Spark Tutorial For Beginn...
Apache Calcite: A Foundational Framework for Optimized Query Processing Over ...
File Format Benchmark - Avro, JSON, ORC & Parquet
Designing ETL Pipelines with Structured Streaming and Delta Lake—How to Archi...
A Deep Dive into Stateful Stream Processing in Structured Streaming with Tath...
A Deep Dive into Spark SQL's Catalyst Optimizer with Yin Huai
Hashing PPT
Context free grammar
From Query Plan to Query Performance: Supercharging your Apache Spark Queries...
AI made easy with Flink AI Flow
Cost-based query optimization in Apache Hive 0.14
Cost-Based Optimizer Framework for Spark SQL: Spark Summit East talk by Ron H...
Performant Streaming in Production: Preventing Common Pitfalls when Productio...
Introduction to Structured Streaming
Ad

Viewers also liked (20)

PDF
Apache Calcite: One planner fits all
PDF
Apache Gearpump next-gen streaming engine
PDF
Streaming SQL (at FlinkForward, Berlin, 2016/09/12)
PDF
Planning with Polyalgebra: Bringing Together Relational, Complex and Machine ...
PDF
SQL on everything, in memory
PDF
Optiq: A dynamic data management framework
PDF
Streaming SQL
PDF
Towards sql for streams
PPT
SQL on Big Data using Optiq
PPTX
Real-time Streaming Analytics for Enterprises based on Apache Storm - Impetus...
PDF
Streaming SQL
PPTX
Discardable In-Memory Materialized Queries With Hadoop
PDF
The twins that everyone loved too much
PPTX
Calcite meetup-2016-04-20
PDF
What's new in Mondrian 4?
PDF
Why you care about
 relational algebra (even though you didn’t know it)
PDF
Cost-based query optimization in Apache Hive 0.14
PDF
Querying the Internet of Things: Streaming SQL on Kafka/Samza and Storm/Trident
PDF
Querying the Internet of Things: Streaming SQL on Kafka/Samza and Storm/Trident
Apache Calcite: One planner fits all
Apache Gearpump next-gen streaming engine
Streaming SQL (at FlinkForward, Berlin, 2016/09/12)
Planning with Polyalgebra: Bringing Together Relational, Complex and Machine ...
SQL on everything, in memory
Optiq: A dynamic data management framework
Streaming SQL
Towards sql for streams
SQL on Big Data using Optiq
Real-time Streaming Analytics for Enterprises based on Apache Storm - Impetus...
Streaming SQL
Discardable In-Memory Materialized Queries With Hadoop
The twins that everyone loved too much
Calcite meetup-2016-04-20
What's new in Mondrian 4?
Why you care about
 relational algebra (even though you didn’t know it)
Cost-based query optimization in Apache Hive 0.14
Querying the Internet of Things: Streaming SQL on Kafka/Samza and Storm/Trident
Querying the Internet of Things: Streaming SQL on Kafka/Samza and Storm/Trident
Ad

Similar to Streaming SQL (20)

PDF
Julian Hyde - Streaming SQL
PDF
Streaming SQL w/ Apache Calcite
PDF
Streaming SQL
PDF
Streaming SQL
PDF
Data all over the place! How SQL and Apache Calcite bring sanity to streaming...
PDF
Building Streaming Applications with Streaming SQL
PDF
WSO2 Analytics Platform: The one stop shop for all your data needs
PPTX
WSO2Con USA 2015: WSO2 Analytics Platform - The One Stop Shop for All Your Da...
PPT
Scalable Realtime Analytics with declarative SQL like Complex Event Processin...
PDF
Apache Calcite: One Frontend to Rule Them All
PDF
Strtio Spark Streaming + Siddhi CEP Engine
PDF
WSO2Con ASIA 2016: WSO2 Analytics Platform: The One Stop Shop for All Your Da...
PDF
Flink Forward SF 2017: Kenneth Knowles - Back to Sessions overview
PDF
WSO2 Product Release Webinar - Introducing the WSO2 Complex Event Processor
PPTX
SCALE - Stream processing and Open Data, a match made in Heaven
PDF
Flink's SQL Engine: Let's Open the Engine Room!
PPTX
Advance sql - window functions patterns and tricks
PPTX
Simplifying SQL with CTE's and windowing functions
PPTX
JUG Tirana - Introduction to data streaming
PDF
Introduction to InfluxDB and TICK Stack
Julian Hyde - Streaming SQL
Streaming SQL w/ Apache Calcite
Streaming SQL
Streaming SQL
Data all over the place! How SQL and Apache Calcite bring sanity to streaming...
Building Streaming Applications with Streaming SQL
WSO2 Analytics Platform: The one stop shop for all your data needs
WSO2Con USA 2015: WSO2 Analytics Platform - The One Stop Shop for All Your Da...
Scalable Realtime Analytics with declarative SQL like Complex Event Processin...
Apache Calcite: One Frontend to Rule Them All
Strtio Spark Streaming + Siddhi CEP Engine
WSO2Con ASIA 2016: WSO2 Analytics Platform: The One Stop Shop for All Your Da...
Flink Forward SF 2017: Kenneth Knowles - Back to Sessions overview
WSO2 Product Release Webinar - Introducing the WSO2 Complex Event Processor
SCALE - Stream processing and Open Data, a match made in Heaven
Flink's SQL Engine: Let's Open the Engine Room!
Advance sql - window functions patterns and tricks
Simplifying SQL with CTE's and windowing functions
JUG Tirana - Introduction to data streaming
Introduction to InfluxDB and TICK Stack

More from Julian Hyde (20)

PPTX
Measures in SQL (SIGMOD 2024, Santiago, Chile)
PDF
Measures in SQL (a talk at SF Distributed Systems meetup, 2024-05-22)
PDF
Building a semantic/metrics layer using Calcite
PDF
Cubing and Metrics in SQL, oh my!
PDF
Adding measures to Calcite SQL
PDF
Morel, a data-parallel programming language
PDF
Is there a perfect data-parallel programming language? (Experiments with More...
PDF
Morel, a Functional Query Language
PDF
The evolution of Apache Calcite and its Community
PDF
What to expect when you're Incubating
PDF
Open Source SQL - beyond parsers: ZetaSQL and Apache Calcite
PDF
Efficient spatial queries on vanilla databases
PDF
Smarter Together - Bringing Relational Algebra, Powered by Apache Calcite, in...
PDF
Tactical data engineering
PDF
Don't optimize my queries, organize my data!
PDF
Spatial query on vanilla databases
PPTX
Lazy beats Smart and Fast
PDF
Don’t optimize my queries, optimize my data!
PDF
Data profiling with Apache Calcite
PDF
A smarter Pig: Building a SQL interface to Apache Pig using Apache Calcite
Measures in SQL (SIGMOD 2024, Santiago, Chile)
Measures in SQL (a talk at SF Distributed Systems meetup, 2024-05-22)
Building a semantic/metrics layer using Calcite
Cubing and Metrics in SQL, oh my!
Adding measures to Calcite SQL
Morel, a data-parallel programming language
Is there a perfect data-parallel programming language? (Experiments with More...
Morel, a Functional Query Language
The evolution of Apache Calcite and its Community
What to expect when you're Incubating
Open Source SQL - beyond parsers: ZetaSQL and Apache Calcite
Efficient spatial queries on vanilla databases
Smarter Together - Bringing Relational Algebra, Powered by Apache Calcite, in...
Tactical data engineering
Don't optimize my queries, organize my data!
Spatial query on vanilla databases
Lazy beats Smart and Fast
Don’t optimize my queries, optimize my data!
Data profiling with Apache Calcite
A smarter Pig: Building a SQL interface to Apache Pig using Apache Calcite

Recently uploaded (20)

PDF
CIFDAQ's Token Spotlight: SKY - A Forgotten Giant's Comeback?
PPTX
Understanding_Digital_Forensics_Presentation.pptx
PDF
Reimagining Insurance: Connected Data for Confident Decisions.pdf
PDF
DevOps & Developer Experience Summer BBQ
PPTX
CroxyProxy Instagram Access id login.pptx
PPTX
Telecom Fraud Prevention Guide | Hyperlink InfoSystem
PPTX
PA Analog/Digital System: The Backbone of Modern Surveillance and Communication
PDF
Peak of Data & AI Encore- AI for Metadata and Smarter Workflows
PPTX
How to Build Crypto Derivative Exchanges from Scratch.pptx
PDF
solutions_manual_-_materials___processing_in_manufacturing__demargo_.pdf
PDF
How UI/UX Design Impacts User Retention in Mobile Apps.pdf
PDF
Modernizing your data center with Dell and AMD
PDF
NewMind AI Weekly Chronicles - August'25 Week I
PDF
A Day in the Life of Location Data - Turning Where into How.pdf
PDF
Enable Enterprise-Ready Security on IBM i Systems.pdf
PPTX
Comunidade Salesforce São Paulo - Desmistificando o Omnistudio (Vlocity)
PDF
NewMind AI Monthly Chronicles - July 2025
PDF
AI And Its Effect On The Evolving IT Sector In Australia - Elevate
PDF
Google’s NotebookLM Unveils Video Overviews
PDF
How AI Agents Improve Data Accuracy and Consistency in Due Diligence.pdf
CIFDAQ's Token Spotlight: SKY - A Forgotten Giant's Comeback?
Understanding_Digital_Forensics_Presentation.pptx
Reimagining Insurance: Connected Data for Confident Decisions.pdf
DevOps & Developer Experience Summer BBQ
CroxyProxy Instagram Access id login.pptx
Telecom Fraud Prevention Guide | Hyperlink InfoSystem
PA Analog/Digital System: The Backbone of Modern Surveillance and Communication
Peak of Data & AI Encore- AI for Metadata and Smarter Workflows
How to Build Crypto Derivative Exchanges from Scratch.pptx
solutions_manual_-_materials___processing_in_manufacturing__demargo_.pdf
How UI/UX Design Impacts User Retention in Mobile Apps.pdf
Modernizing your data center with Dell and AMD
NewMind AI Weekly Chronicles - August'25 Week I
A Day in the Life of Location Data - Turning Where into How.pdf
Enable Enterprise-Ready Security on IBM i Systems.pdf
Comunidade Salesforce São Paulo - Desmistificando o Omnistudio (Vlocity)
NewMind AI Monthly Chronicles - July 2025
AI And Its Effect On The Evolving IT Sector In Australia - Elevate
Google’s NotebookLM Unveils Video Overviews
How AI Agents Improve Data Accuracy and Consistency in Due Diligence.pdf

Streaming SQL

  • 1. Streaming SQL Julian Hyde Apache Samza meetup Mountain View, CA 2016/2/17
  • 2. @julianhyde SQL Query planning Query federation OLAP Streaming Hadoop Thanks to Milinda Pathirage for his work on samza- sql and the design of streaming SQL
  • 3. Why SQL? ● API to your database ● Ask for what you want, system decides how to get it ● Query planner (optimizer) converts logical queries to physical plans ● Mathematically sound language (relational algebra) ● For all data, not just data in a database ● Opportunity for novel data organizations & algorithms ● Standard https://www.flickr.com/photos/pere/523019984/ (CC BY-NC-SA 2.0) ➢ API to your database ➢ Ask for what you want, system decides how to get it ➢ Query planner (optimizer) converts logical queries to physical plans ➢ Mathematically sound language (relational algebra) ➢ For all data, not just “flat” data in a database ➢ Opportunity for novel data organizations & algorithms ➢ Standard Why SQL?
  • 4. How much is your data worth? Recent data is more valuable ➢ ...if you act on it in time Data moves from expensive memory to cheaper disk as it cools Old + new data is more valuable still ➢ ...if we have a means to combine them Time Value of data ($/B) Now1 hour ago 1 day ago 1 week ago 1 year ago
  • 5. Simple queries select * from Products where unitPrice < 20 select stream * from Orders where units > 1000 ➢ Traditional (non-streaming) ➢ Products is a table ➢ Retrieves records from -∞ to now ➢ Streaming ➢ Orders is a stream ➢ Retrieves records from now to +∞ ➢ Query never terminates
  • 6. Stream-table duality select * from Orders where units > 1000 ➢ Yes, you can use a stream as a table ➢ And you can use a table as a stream ➢ Actually, Orders is both ➢ Use the stream keyword ➢ Where to actually find the data? That’s up to the system select stream * from Orders where units > 1000
  • 7. Combining past and future select stream * from Orders as o where units > ( select avg(units) from Orders as h where h.productId = o.productId and h.rowtime > o.rowtime - interval ‘1’ year) ➢ Orders is used as both stream and table ➢ System determines where to find the records ➢ Query is invalid if records are not available
  • 8. The “pie chart” problem ➢ Task: Write a web page summarizing orders over the last hour ➢ Problem: The Orders stream only contains the current few records ➢ Solution: Materialize short-term history Orders over the last hour Beer 48% Cheese 30% Wine 22% select productId, count(*) from Orders where rowtime > current_timestamp - interval ‘1’ hour group by productId
  • 9. Aggregation and windows on streams GROUP BY aggregates multiple rows into sub- totals ➢ In regular GROUP BY each row contributes to exactly one sub-total ➢ In multi-GROUP BY (e.g. HOP, GROUPING SETS) a row can contribute to more than one sub-total Window functions leave the number of rows unchanged, but compute extra expressions for each row (based on neighboring rows) Multi GROUP BY Window functions GROUP BY
  • 10. GROUP BY select stream productId, floor(rowtime to hour) as rowtime, sum(units) as u, count(*) as c from Orders group by productId, floor(rowtime to hour) rowtime productId units 09:12 100 5 09:25 130 10 09:59 100 3 10:00 100 19 11:05 130 20 rowtime productId u c 09:00 100 8 2 09:00 130 10 1 10:00 100 19 1 not emitted yet; waiting for a row >= 12:00
  • 11. When are rows emitted? The replay principle: A streaming query produces the same result as the corresponding non- streaming query would if given the same data in a table. Output must not rely on implicit information (arrival order, arrival time, processing time, or punctuations)
  • 12. Making progress It’s not enough to get the right result. We need to give the right result at the right time. Ways to make progress without compromising safety: ➢ Monotonic columns (e.g. rowtime) and expressions (e.g. floor (rowtime to hour)) ➢ Punctuations (aka watermarks) ➢ Or a combination of both select stream productId, count(*) as c from Orders group by productId; ERROR: Streaming aggregation requires at least one monotonic expression in GROUP BY clause
  • 13. Window types ➢ Tumbling window: “Every T seconds, emit the total for T seconds” ➢ Hopping window: “Every T seconds, emit the total for T2 seconds” ➢ ➢ Sliding window: “Every record, emit the total for the surrounding T seconds” or “Every record, emit the total for the surrounding T records” (see next slide…) select … from Orders group by floor(rowtime to hour) select … from Orders group by tumble(rowtime, interval ‘1’ hour) select stream … from Orders group by hop(rowtime, interval ‘1’ hour, interval ‘2’ hour)
  • 14. Window functions select stream sum(units) over w as units1h, sum(units) over w (partition by productId) as units1hp, rowtime, productId, units from Orders window w as (order by rowtime range interval ‘1’ hour preceding) rowtime productId units 09:12 100 5 09:25 130 10 09:59 100 3 10:17 100 10 units1h units1hp rowtime productId units 5 5 09:12 100 5 15 10 09:25 130 10 18 8 09:59 100 3 23 13 10:17 100 10
  • 15. Join stream to a table Inputs are the Orders stream and the Products table, output is a stream. Acts as a “lookup”. Execute by caching the table in a hash- map (if table is not too large) and stream order will be preserved. select stream * from Orders as o join Products as p on o.productId = p.productId
  • 16. Join stream to a changing table Execution is more difficult if the Products table is being changed while the query executes. To do things properly (e.g. to get the same results when we re-play the data), we’d need temporal database semantics. (Sometimes doing things properly is too expensive.) select stream * from Orders as o join Products as p on o.productId = p.productId and o.rowtime between p.startEffectiveDate and p.endEffectiveDate
  • 17. Join stream to a stream We can join streams if the join condition forces them into “lock step”, within a window (in this case, 1 hour). Which stream to put input a hash table? It depends on relative rates, outer joins, and how we’d like the output sorted. select stream * from Orders as o join Shipments as s on o.productId = p.productId and s.rowtime between o.rowtime and o.rowtime + interval ‘1’ hour
  • 18. Planning queries MySQL Splunk join Key: productId group Key: productName Agg: count filter Condition: action = 'purchase' sort Key: c desc scan scan Table: products select p.productName, count(*) as c from splunk.splunk as s join mysql.products as p on s.productId = p.productId where s.action = 'purchase' group by p.productName order by c desc Table: splunk
  • 19. Optimized query MySQL Splunk join Key: productId group Key: productName Agg: count filter Condition: action = 'purchase' sort Key: c desc scan scan Table: splunk Table: products select p.productName, count(*) as c from splunk.splunk as s join mysql.products as p on s.productId = p.productId where s.action = 'purchase' group by p.productName order by c desc
  • 20. Apache Calcite Apache top-level project since October, 2015 Query planning framework ➢ Relational algebra, rewrite rules ➢ Cost model & statistics ➢ Federation via adapters ➢ Extensible Packaging ➢ Library ➢ Optional SQL parser, JDBC server ➢ Community-authored rules, adapters Embedded Adapters Streaming Apache Drill Apache Hive Apache Kylin Apache Phoenix* Cascading Lingual Apache Cassandra* Apache Spark CSV In-memory JDBC JSON MongoDB Splunk Web tables Apache Flink* Apache Samza Apache Storm * Under development
  • 22. Relational algebra (plus streaming) Core operators: ➢ Scan ➢ Filter ➢ Project ➢ Join ➢ Sort ➢ Aggregate ➢ Union ➢ Values Streaming operators: ➢ Delta (converts relation to stream) ➢ Chi (converts stream to relation) In SQL, the STREAM keyword signifies Delta
  • 23. Optimizing streaming queries The usual relational transformations still apply: push filters and projects towards sources, eliminate empty inputs, etc. The transformations for delta are mostly simple: ➢ Delta(Filter(r, predicate)) → Filter(Delta(r), predicate) ➢ Delta(Project(r, e0, ...)) → Project(Delta(r), e0, …) ➢ Delta(Union(r0, r1), ALL) → Union(Delta(r0), Delta(r1)) But not always: ➢ Delta(Join(r0, r1, predicate)) → Union(Join(r0, Delta(r1)), Join(Delta(r0), r1) ➢ Delta(Scan(aTable)) → Empty
  • 24. ORDER BY Sorting a streaming query is valid as long as the system can make progress. select stream productId, floor(rowtime to hour) as rowtime, sum(units) as u, count(*) as c from Orders group by productId, floor(rowtime to hour) order by rowtime, c desc
  • 25. Union As in a typical database, we rewrite x union y to select distinct * from (x union all y) We can implement x union all y by simply combining the inputs in arrival order but output is no longer monotonic. Monotonicity is too useful to squander! To preserve monotonicity, we merge on the sort key (e.g. rowtime).
  • 26. DML ➢ View & standing INSERT give same results ➢ Useful for chained transforms ➢ But internals are different insert into LargeOrders select stream * from Orders where units > 1000 create view LargeOrders as select stream * from Orders where units > 1000 upsert into OrdersSummary select stream productId, count(*) over lastHour as c from Orders window lastHour as ( partition by productId order by rowtime range interval ‘1’ hour preceding) Use DML to maintain a “window” (materialized stream history).
  • 27. Summary: Streaming SQL features Standard SQL over streams and relations Streaming queries on relations, and relational queries on streams Joins between stream-stream and stream-relation Queries are valid if the system can get the data, with a reasonable latency ➢ Monotonic columns and punctuation are ways to achieve this Views, materialized views and standing queries
  • 28. Summary: The benefits of streaming SQL High-level language lets the system optimize quality of service (QoS) and data location Give existing tools and traditional users to access streaming data Combine streaming and historic data Streaming SQL is a superset of standard SQL Discussion continues at Apache Calcite, with contributions from Samza, Flink, Storm and others. (Please join in!)
  • 29. Thank you! @julianhyde @ApacheCalcite http://calcite.apache.org http://calcite.apache.org/docs/stream.html “Data in Flight”, Communications of the ACM, January 2010 [article] [SAMZA-390] High-level language for SAMZA