Introducing Switch: a framework for custom data applications Josh - - PowerPoint PPT Presentation

introducing switch a framework for custom data
SMART_READER_LITE
LIVE PREVIEW

Introducing Switch: a framework for custom data applications Josh - - PowerPoint PPT Presentation

Introducing Switch: a framework for custom data applications Josh Ferguson Chief Architect @ Mode josh@modeanalytics.com were going to talk about building tools to make better decisions with data ive been obsessed with building data


slide-1
SLIDE 1

Introducing Switch: a framework for custom data applications

Josh Ferguson Chief Architect @ Mode josh@modeanalytics.com

slide-2
SLIDE 2

we’re going to talk about building tools to make better decisions with data

slide-3
SLIDE 3

i’ve been obsessed with building data tools for about 20 years

slide-4
SLIDE 4

@besquared almost everywhere

slide-5
SLIDE 5

mode(.com)

slide-6
SLIDE 6

a collaborative data science platform

slide-7
SLIDE 7
  • ur users are data scientists, analysts, and engineers
slide-8
SLIDE 8

help everybody make better decisions with data

slide-9
SLIDE 9

we’re here to talk about data applications

slide-10
SLIDE 10

custom data applications

slide-11
SLIDE 11

what’s a custom data application?

slide-12
SLIDE 12

BUSINESS OPERATIONS (SORTED BY SPECIFICITY)

well supported by companies and tools this long tail is our competitive advantage

INDUSTRY STANDARD DOMAIN SPECIFIC LEVEL OF OFF-THE-SHELF TOOL SUPPORT

slide-13
SLIDE 13

there's no collection of off-the-shelf tools that will provide everything our organization needs to make better decisions with data

slide-14
SLIDE 14

this is where we should focus

slide-15
SLIDE 15

logistics tracking and monitoring

slide-16
SLIDE 16

customer health monitoring tools for success

slide-17
SLIDE 17

a/b testing tools for our product team

slide-18
SLIDE 18

...

slide-19
SLIDE 19
slide-20
SLIDE 20
slide-21
SLIDE 21

everyone one of these apps is a one-off today

slide-22
SLIDE 22
slide-23
SLIDE 23

switch is a collection of typescript libraries and tools that let us build richer and more interactive data applications

slide-24
SLIDE 24

the data layer between our database and

  • ur user interface
slide-25
SLIDE 25

it lets us address some of the major challenges we face when we’re building

  • ur data apps
slide-26
SLIDE 26

challenge number one

slide-27
SLIDE 27

CHALLENGE #1

  • ur users always want to slice and dice their data

in ways that we don’t anticipate

slide-28
SLIDE 28

CHALLENGE #1

we don’t know what we’ll need ahead of time

slide-29
SLIDE 29

CHALLENGE #1

we can’t build a new etl pipeline or deploy

  • ur app every time we need to answer a

slightly different question

slide-30
SLIDE 30

CHALLENGE #1

we should give our users the tools they need to quickly and easily express data in new and different ways on their own

slide-31
SLIDE 31

Introducing Formulas

slide-32
SLIDE 32

an excel-like language for data expression

slide-33
SLIDE 33

they let our users build custom calculations, even if they’re not database or programming language experts

slide-34
SLIDE 34

what can they do with them?

slide-35
SLIDE 35

unlike excel whose formulas operate on cells,

  • ur formulas operate on entire datasets at a time
slide-36
SLIDE 36

FORMULAS

sample dataset

ID Date Product Quantity Price Filled 1 2019-01-01 A 10 10.00 true 2 2019-01-02 B 5 20.00 false ... ... ... ... ...

slide-37
SLIDE 37

[Price] / [Quantity]

EXAMPLES

calculate ratios!

slide-38
SLIDE 38

Dollar to cents [Price] * 100

EXAMPLES

convert units!

slide-39
SLIDE 39

CASE [Product] WHEN “A,” THEN “A” ELSE [Product] END

EXAMPLES

clean data!

slide-40
SLIDE 40

AVG([Price] / [Quantity])

EXAMPLES

aggregate data!

slide-41
SLIDE 41

LOOKUP(AVG([Price]), FIRST())

EXAMPLES

lookup values!

slide-42
SLIDE 42

what else!?

slide-43
SLIDE 43

NULL

LITERALS

nulls

slide-44
SLIDE 44

TRUE FALSE

LITERALS

booleans

slide-45
SLIDE 45
  • 42

1000 3.1415926 0xBEEF

LITERALS

numbers

slide-46
SLIDE 46

‘Category’ “Product Name”

LITERALS

strings

slide-47
SLIDE 47

#2019-04-18# #2019-04-18T10:50:15#

LITERALS

dates

slide-48
SLIDE 48

/[\w\d]+/ig

LITERALS

regular expressions

slide-49
SLIDE 49

[Product] [Quantity]

ACCESS

data access

slide-50
SLIDE 50

[Quantity] * 500 [Quantity] / 500 [Quantity] + 500 [Quantity] - 500 [Quantity] % 500

OPERATORS

mathematic

slide-51
SLIDE 51

[Quantity] = 500 [Quantity] <> 500 [Quantity] < 500 [Quantity] <= 500 [Quantity] > 500 [Quantity] >= 500

OPERATORS

relational

slide-52
SLIDE 52

NOT [Filled] [Filled] AND [Quantity] > 500 [Filled] OR [Quantity] <= 500

OPERATORS

logical

slide-53
SLIDE 53

CASE [Filled] WHEN TRUE THEN “Filled” WHEN FALSE THEN “Unfilled” ELSE “Unknown” END

CONDITIONAL

case

slide-54
SLIDE 54

NOW()

FUNCTIONS

constant

slide-55
SLIDE 55

FLOOR([Price]) TRIM([Product]) DATETRUNC(‘day’, [Date])

FUNCTIONS

scalar

slide-56
SLIDE 56

SUM([Price]) AVG([Quantity]) COUNTD([Product])

FUNCTIONS

aggregate

slide-57
SLIDE 57

RANK(SUM([Quantity])) RUNNING_SUM(COUNT([Price])) LOOKUP(AVG([Price]), FIRST())

FUNCTIONS

analytic

slide-58
SLIDE 58

that’s it, simple and powerful

slide-59
SLIDE 59

we can build interfaces that let users extend our apps with their own business logic and calculations

slide-60
SLIDE 60

for example at Mode we’re working on a formula editor that lets our users add custom calculations to their visualizations

slide-61
SLIDE 61

a single formula that takes someone a few minutes to write might take hours or days to implement and deploy otherwise

slide-62
SLIDE 62

not having to build etl pipelines or write app code every time we want to answer a different question amplifies our effort 100x

slide-63
SLIDE 63

that’s pretty rad

slide-64
SLIDE 64

let’s keep going and see how we use formulas to query our data

slide-65
SLIDE 65

challenge number two

slide-66
SLIDE 66

CHALLENGE #2

getting from data to visualization

slide-67
SLIDE 67

CHALLENGE #2

a common characteristic of custom data apps is custom data visualizations

slide-68
SLIDE 68

CHALLENGE #2

we don’t want to write ad-hoc data transformation code every time we want to build a visualization

slide-69
SLIDE 69

CHALLENGE #2

we should use a language that let’s us describe the data we need in way that matches the visualizations we’re trying to build

slide-70
SLIDE 70

Introducing Queries

slide-71
SLIDE 71
  • ur queries speak the language of data visualization
slide-72
SLIDE 72

QUERIES

grammar

  • f graphics
slide-73
SLIDE 73

most of the visualizations that we can encode with tools like vega-lite can be translated directly into switch queries

slide-74
SLIDE 74

how do they work?

slide-75
SLIDE 75

we define the data we want in our query

slide-76
SLIDE 76

Field { formula: string; }

QUERIES

we use fields which are defined with a formula

slide-77
SLIDE 77

Field { formula: string; }

QUERIES

they let us describe the data and calculations we want to get back in our query result

slide-78
SLIDE 78

“SUM([Quantity])” “[Price] / [Quantity]” “DATETRUNC(‘day’, [Date])”

QUERIES

they’re the atomic unit of data in a query

slide-79
SLIDE 79

Names { formula: “$[Names]”; } Values { formula: “$[Values]”; }

QUERIES

there are two pre-defined fields called names and values

slide-80
SLIDE 80

NAMES/VALUES

they let us combine multiple aggregate fields together into a single field

Names { formula: “$[Names]”; } Values { formula: “$[Values]”; }

slide-81
SLIDE 81

QUERIES

we’ve got filters

Filter { field: Field; conds: Conditions; }

slide-82
SLIDE 82

QUERIES

they let us get rid

  • f data we don’t

want by adding conditions on our fields

Filter { field: Field; conds: Conditions; }

slide-83
SLIDE 83

QUERIES

we’ve got sorts

Sort { field: Field; type: SortType;

  • rder: SortOrder;

}

slide-84
SLIDE 84

QUERIES

they let us re-arrange our result by adding

  • rders to our fields

Sort { field: Field; type: SortType;

  • rder: SortOrder;

}

slide-85
SLIDE 85

we map our data to our visualization

slide-86
SLIDE 86

QUERIES

the first way to do that is with marks

Mark { field: Field; color: Field[]; size: Field[]; label: Field[]; ... }

slide-87
SLIDE 87

QUERIES

marks are how we describe the layers

  • f our visualization

Mark { field: Field; color: Field[]; size: Field[]; label: Field[]; ... }

slide-88
SLIDE 88

MARKS

every layer is defined by a single field

Mark { field: Field; color: Field[]; size: Field[]; label: Field[]; ... }

slide-89
SLIDE 89

MARKS

it’s got channels like color, size, and label, that let us map fields to visual properties

Mark { field: Field; color: Field[]; size: Field[]; label: Field[]; ... }

slide-90
SLIDE 90

MARKS

we can map as many channels as we want based on the needs of our visualization

Mark { field: Field; color: Field[]; size: Field[]; label: Field[]; ... }

slide-91
SLIDE 91

QUERIES

using marks and the other pieces we talked about we can build a complete visual mapping which we call a pivot query

PivotQuery { column: Field[]; x: Field[]; row: Field[]; y: Field[]; values: Field[]; marks: Mark[]; filters: Filter[]; sorts: Sort[]; }

slide-92
SLIDE 92

QUERIES

marks, filters, and sorts

PivotQuery { column: Field[]; x: Field[]; row: Field[]; y: Field[]; values: Field[]; marks: Mark[]; filters: Filter[]; sorts: Sort[]; }

slide-93
SLIDE 93

PIVOT QUERY

more channels

PivotQuery { column: Field[]; x: Field[]; row: Field[]; y: Field[]; values: Field[]; marks: Mark[]; filters: Filter[]; sorts: Sort[]; }

slide-94
SLIDE 94

PIVOT QUERY

column and row which let us facet data across or down our visualization

PivotQuery { column: Field[]; x: Field[]; row: Field[]; y: Field[]; values: Field[]; marks: Mark[]; filters: Filter[]; sorts: Sort[]; }

slide-95
SLIDE 95

PIVOT QUERY

x and y which let us position data across or down

  • ur visualization

within those facets

PivotQuery { column: Field[]; x: Field[]; row: Field[]; y: Field[]; values: Field[]; marks: Mark[]; filters: Filter[]; sorts: Sort[]; }

slide-96
SLIDE 96

PIVOT QUERY

values which let’s us combine all of the fields in it into a single field that we can use in the

  • ther channels

PivotQuery { column: Field[]; x: Field[]; row: Field[]; y: Field[]; values: Field[]; marks: Mark[]; filters: Filter[]; sorts: Sort[]; }

slide-97
SLIDE 97
slide-98
SLIDE 98

QUERIES

a beautiful chart

slide-99
SLIDE 99

PivotQuery { x: [ “DATETRUNC(‘day’, [Date])” ], y: [ “$[Values]” ], values: [ “SUM([Price])”, “RUNNING_SUM(SUM([Quantity]))” ], marks: [{ field: “$[Values]”, color: [ “$[Names]” ] }] }

QUERIES

a beautiful query

slide-100
SLIDE 100

EXAMPLE

day on the x axis

PivotQuery { x: [ “DATETRUNC(‘day’, [Date])” ], y: [ “$[Values]” ], values: [ “SUM([Price])”, “RUNNING_SUM(SUM([Quantity]))” ], marks: [{ field: “$[Values]”, color: [ “$[Names]” ] }] }

slide-101
SLIDE 101

EXAMPLE

values field on the y axis

PivotQuery { x: [ “DATETRUNC(‘day’, [Date])” ], y: [ “$[Values]” ], values: [ “SUM([Price])”, “RUNNING_SUM(SUM([Quantity]))” ], marks: [{ field: “$[Values]”, color: [ “$[Names]” ] }] }

slide-102
SLIDE 102

EXAMPLE

sum of price and a running sum of quantity in values

PivotQuery { x: [ “DATETRUNC(‘day’, [Date])” ], y: [ “$[Values]” ], values: [ “SUM([Price])”, “RUNNING_SUM(SUM([Quantity]))” ], marks: [{ field: “$[Values]”, color: [ “$[Names]” ] }] }

slide-103
SLIDE 103

EXAMPLE

a single layer so we’ve got one mark

PivotQuery { x: [ “DATETRUNC(‘day’, [Date])” ], y: [ “$[Values]” ], values: [ “SUM([Price])”, “RUNNING_SUM(SUM([Quantity]))” ], marks: [{ field: “$[Values]”, color: [ “$[Names]” ] }] }

slide-104
SLIDE 104

EXAMPLE

defined by our values field

PivotQuery { x: [ “DATETRUNC(‘day’, [Date])” ], y: [ “$[Values]” ], values: [ “SUM([Price])”, “RUNNING_SUM(SUM([Quantity]))” ], marks: [{ field: “$[Values]”, color: [ “$[Names]” ] }] }

slide-105
SLIDE 105

EXAMPLE

within that layer we want to see two distinct series each with its own color so we add names to our color channel

PivotQuery { x: [ “DATETRUNC(‘day’, [Date])” ], y: [ “$[Values]” ], values: [ “SUM([Price])”, “RUNNING_SUM(SUM([Quantity]))” ], marks: [{ field: “$[Values]”, color: [ “$[Names]” ] }] }

slide-106
SLIDE 106

PivotQuery { x: [ “DATETRUNC(‘day’, [Date])” ], y: [ “$[Values]” ], values: [ “SUM([Price])”, “RUNNING_SUM(SUM([Quantity]))” ], marks: [{ field: “$[Values]”, color: [ “$[Names]” ] }] }

slide-107
SLIDE 107
  • ver time it becomes second nature
slide-108
SLIDE 108
  • nce we learn to speak the language our

ability to quickly transform and visualize data is increased by 10x

slide-109
SLIDE 109

challenge number three

slide-110
SLIDE 110

CHALLENGE #3

  • ur datasets are millions and billions of rows

and growing

slide-111
SLIDE 111

CHALLENGE #3

we can’t constantly move it around or try to materialize everything we might need to analyze ahead of time

slide-112
SLIDE 112

CHALLENGE #3

we should work with our data as it exists in the places where it already lives

slide-113
SLIDE 113

Introducing Processors

slide-114
SLIDE 114

they’re the secret sauce

slide-115
SLIDE 115

they make it possible for our data apps to take advantage of the high performance and massive scale of the databases we already have

slide-116
SLIDE 116

they’re our database’s analytical co-pilots

slide-117
SLIDE 117

what do we mean by that?

slide-118
SLIDE 118

let’s talk about how they work

slide-119
SLIDE 119

PROCESSORS

processors take in queries and compute results

Query Execution Planning Result Relational Database

slide-120
SLIDE 120

PROCESSORS

we start with a query like the

  • ne we saw in

the last section

Query Execution Planning Result Relational Database

slide-121
SLIDE 121

PROCESSORS

we build a plan, which is a set of instructions for processing that query

Query Execution Planning Result Relational Database

slide-122
SLIDE 122

PROCESSORS

that plan gets passed along to the next step where it’s executed by the processor

Query Execution Planning Result Relational Database

slide-123
SLIDE 123

PROCESSORS

during execution, the processor will issue queries against our database

Query Execution Planning Result Relational Database

slide-124
SLIDE 124

PROCESSORS

it’ll take those intermediate query results and process them further to produce a final result

Query Execution Planning Result Relational Database

slide-125
SLIDE 125

PROCESSORS

the last step is taking the final result and sending it back to our app

Query Execution Planning Result Relational Database

slide-126
SLIDE 126

let’s look at how planning works first

slide-127
SLIDE 127

the planner looks at our query in a specific

  • rder and builds a logical execution plan
slide-128
SLIDE 128

PROCESSORS

we go through the fields in each channel

2 Names/ Values 4 Sorts 3 Filters 5 Limit/ Offset 1 Fields

slide-129
SLIDE 129

PROCESSORS

if we have names or values fields we add those to the plan

2 Names/ Values 4 Sorts 3 Filters 5 Limit/ Offset 1 Fields

slide-130
SLIDE 130

PROCESSORS

after that we plan all of the filters

2 Names/ Values 4 Sorts 3 Filters 5 Limit/ Offset 1 Fields

slide-131
SLIDE 131

PROCESSORS

followed by sorts

2 Names/ Values 4 Sorts 3 Filters 5 Limit/ Offset 1 Fields

slide-132
SLIDE 132

PROCESSORS

finally we add a limit or offset if they’re part

  • f the query

2 Names/ Values 4 Sorts 3 Filters 5 Limit/ Offset 1 Fields

slide-133
SLIDE 133

as we go through each step the planner decides what parts of the query we want to process in the database and what we want to process on the “client”

slide-134
SLIDE 134

how does it decide?

slide-135
SLIDE 135

the planner always decides to “push-down” grouping and aggregate expressions and “pull-up” analytical expressions

slide-136
SLIDE 136
slide-137
SLIDE 137

Field 1 + RUNNING_AVG(SUM([Price]) + 1)

DATAFLOW

let’s say we’ve got this field in our query

slide-138
SLIDE 138

Field 1 + RUNNING_AVG(SUM([Price]) + 1) |________________|

DATAFLOW

this is an aggregate expression

slide-139
SLIDE 139

Field 1 + RUNNING_AVG(SUM([Price]) + 1) |________________|

DATAFLOW

an aggregate expression is any aggregate function and the operators attached to it

slide-140
SLIDE 140

Field 1 + RUNNING_AVG(SUM([Price]) + 1) |______________|

DATAFLOW

this is an analytic expression

slide-141
SLIDE 141

Field 1 + RUNNING_AVG(SUM([Price]) + 1) |______________|

DATAFLOW

an analytic expression is any analytic function and the operators attached to it

slide-142
SLIDE 142

Field 1 + RUNNING_AVG(SUM([Price]) + 1) Push-Down ? Pull-Up ?

DATAFLOW

the planner will split this field into two parts

slide-143
SLIDE 143

Field 1 + RUNNING_AVG(SUM([Price]) + 1) Push-Down SUM([Price]) + 1 AS C1 Pull-Up ?

DATAFLOW

the aggregate expression gets pushed down to the database

slide-144
SLIDE 144

Field 1 + RUNNING_AVG(SUM([Price]) + 1) Push-Down SUM([Price]) + 1 AS C1 Pull-Up 1 + RUNNING_SUM([C1])

DATAFLOW

the analytic expression gets pulled up to the processor

slide-145
SLIDE 145

Field 1 + RUNNING_AVG(SUM([Price]) + 1) Push-Down SUM([Price]) + 1 AS C1 Pull-Up 1 + RUNNING_SUM([C1])

DATAFLOW

expressions that are pushed down get a unique alias that we use to reference the results

slide-146
SLIDE 146

why don’t we do everything in the database?

slide-147
SLIDE 147
  • rganizations operate dozens of

databases across almost as many vendors

slide-148
SLIDE 148

we want a common data processing model that we can rely on across all of the apps in our

  • rganization
slide-149
SLIDE 149

as long as our databases can do basic stuff like select, group, aggregate, filter, and sort, we can handle the rest

slide-150
SLIDE 150
slide-151
SLIDE 151

PivotQuery { x: [ “DATETRUNC(‘day’, [Date])” ], y: [ “$[Values]” ], values: [ “SUM([Price])”, “RUNNING_SUM(SUM([Quantity]))” ], marks: [{ field: “$[Values]”, color: [ “$[Names]” ] }] }

EXECUTION

we’re going to walk through how we would execute the plan for our beautiful query

slide-152
SLIDE 152

PROCESSORS

execute our pushed down query against

  • ur relational

database

Result SQL Query Fold Names Values Analytic Evaluation Result Selection

slide-153
SLIDE 153

EXECUTION

we’ve got three expressions here that get pushed down

PivotQuery { x: [ “DATETRUNC(‘day’, [Date])” ], y: [ “$[Values]” ], values: [ “SUM([Price])”, “RUNNING_SUM(SUM([Quantity]))” ], marks: [{ field: “$[Values]”, color: [ “$[Names]” ] }] }

slide-154
SLIDE 154

EXECUTION

day on our x-axis

PivotQuery { x: [ “DATETRUNC(‘day’, [Date])” ], y: [ “$[Values]” ], values: [ “SUM([Price])”, “RUNNING_SUM(SUM([Quantity]))” ], marks: [{ field: “$[Values]”, color: [ “$[Names]” ] }] }

slide-155
SLIDE 155

EXECUTION

sum of price on values

PivotQuery { x: [ “DATETRUNC(‘day’, [Date])” ], y: [ “$[Values]” ], values: [ “SUM([Price])”, “RUNNING_SUM(SUM([Quantity]))” ], marks: [{ field: “$[Values]”, color: [ “$[Names]” ] }] }

slide-156
SLIDE 156

EXECUTION

sum of quantity also from values

PivotQuery { x: [ “DATETRUNC(‘day’, [Date])” ], y: [ “$[Values]” ], values: [ “SUM([Price])”, “RUNNING_SUM(SUM([Quantity]))” ], marks: [{ field: “$[Values]”, color: [ “$[Names]” ] }] }

slide-157
SLIDE 157

SELECT DATETRUNC('day', date) AS C1 SUM(price) AS C2, SUM(quantity) AS C3 FROM orders GROUP BY DATETRUNC('day', date)

EXECUTION

that gives us this beautiful sql query

slide-158
SLIDE 158

EXECUTION

the table name comes from a data model which let’s the processor know about our database schema

SELECT DATETRUNC('day', date) AS C1 SUM(price) AS C2, SUM(quantity) AS C3 FROM orders GROUP BY DATETRUNC('day', date)

slide-159
SLIDE 159

EXECUTION

this is what

  • ur database

hands back

DAY(Date) SUM(price) SUM(quantity) 2019-01-01 10 15 2019-01-02 5 5 ... ... ...

slide-160
SLIDE 160

PROCESSORS

we take that and evaluate

  • ur analytic

expressions

Result SQL Query Fold Names Values Analytic Evaluation Result Selection

slide-161
SLIDE 161

EXECUTION

+ running_sum

DAY(Date) SUM(price) SUM(quantity) RUNNING_SUM(quantity) 2019-01-01 10 15 15 2019-01-02 5 5 20 ... ... ...

slide-162
SLIDE 162

PROCESSORS

we use a fold transform to “unpivot” the result

Result SQL Query Fold Names Values Analytic Evaluation Result Selection

slide-163
SLIDE 163

Names Values DAY (Date) SUM (price) SUM (quantity) RUNNING_SUM (quantity)

SUM(price) 10 2019-01-01 10 15 15 RUNNING_SUM (quantity) 15 2019-01-01 10 5 15 SUM(price) 5 2019-01-02 5 15 20 RUNNING_SUM (quantity) 20 2019-01-02 5 5 20 ... ... ... ... ...

EXECUTION

+ names + values expand the number of rows

slide-164
SLIDE 164

PROCESSORS

we select just the fields that we want in our result

Result SQL Query Fold Names Values Analytic Evaluation Result Selection

slide-165
SLIDE 165

Names Values DAY(Date) SUM(price) 10 2019-01-01 RUNNING_SUM(quantity) 15 2019-01-01 SUM(price) 5 2019-01-02 RUNNING_SUM(quantity) 20 2019-01-02 ... ... ...

EXECUTION

  • sum price
  • sum quantity
  • running_sum
slide-166
SLIDE 166

PROCESSORS

results go back to the app

Result SQL Query Fold Names Values Analytic Evaluation Result Selection

slide-167
SLIDE 167

Names Values DAY(Date) SUM(price) 10 2019-01-01 RUNNING_SUM(quantity) 15 2019-01-01 SUM(price) 5 2019-01-02 RUNNING_SUM(quantity) 20 2019-01-02 ... ... ...

PivotQuery { x: [ “DATETRUNC(‘day’, [Date])” ], y: [ “$[Values]” ], values: [ “SUM([Price])”, “RUNNING_SUM(SUM([Quantity]))” ], marks: [{ field: “$[Values]”, color: [ “$[Names]” ] }] }

slide-168
SLIDE 168

and that’s how the tables turn

slide-169
SLIDE 169

this strategy pays big dividends

slide-170
SLIDE 170

not having to move data around or materialize all of our views ahead of time lets us effectively use 1000x more data

slide-171
SLIDE 171

where does that bring us?

slide-172
SLIDE 172

a familiar excel-like formula language that lets our users explore data in different ways without new etl pipelines or app code

slide-173
SLIDE 173

100x

slide-174
SLIDE 174

a visual query language that lets us ask for the data we need in a way that matches the visualizations we’re trying deliver

slide-175
SLIDE 175

10x

slide-176
SLIDE 176

data processors that let us deploy our visualization queries on top of the high performance databases we already have

slide-177
SLIDE 177

1000x

slide-178
SLIDE 178
slide-179
SLIDE 179

1,000,000x

slide-180
SLIDE 180

a game changer for data teams and decision makers

slide-181
SLIDE 181

where are we going to go from here?

slide-182
SLIDE 182

ROADMAP

where are we going from here?

  • Release the code under open license
slide-183
SLIDE 183

ROADMAP

where are we going from here?

  • Release the code under open license
  • Expand the built-in function library
slide-184
SLIDE 184

ROADMAP

where are we going from here?

  • Release the code under open license
  • Expand the built-in function library
  • Build out more real-world examples
slide-185
SLIDE 185

ROADMAP

where are we going from here?

  • Release the code under open license
  • Expand the built-in function library
  • Built out more real-world examples
  • Expand our database adapter library
slide-186
SLIDE 186

ROADMAP

where are we going from here?

  • Release the code under open license
  • Expand the built-in function library
  • Build out more real-world examples
  • Expand our database adapter library
  • Integrate with open tools like DBT
slide-187
SLIDE 187

ROADMAP

where are we going from here?

  • Release the code under open license
  • Expand the built-in function library
  • Build out more real-world examples
  • Expand our database adapter library
  • Integrate with open tools like DBT
  • Integrate with libraries like vega-lite
slide-188
SLIDE 188

ROADMAP

where are we going from here?

  • Release the code under open license
  • Expand the built-in function library
  • Build out more real-world examples
  • Expand our database adapter library
  • Integrate with open tools like DBT
  • Integrate with libraries like vega-lite
  • Build common components for frameworks

like angular, react, native, etc.

slide-189
SLIDE 189

COMMUNITY

how do I get involved?

slide-190
SLIDE 190

COMMUNITY

head on over herewe github.com/switch-data/community

slide-191
SLIDE 191

COMMUNITY

AND HIT THE STAR BUTTONNN github.com/switch-data/community

slide-192
SLIDE 192

COMMUNITY

how can I help you?

slide-193
SLIDE 193
slide-194
SLIDE 194

thank you again

slide-195
SLIDE 195

Q&A

Come see me during office hours!