Querying Pinot
Learn how to query Pinot using SQL
SQL interface
Pinot provides a SQL interface for querying. It uses the Calcite SQL parser to parse queries and the MYSQL_ANSI dialect. For details on the syntax, see the the Calcite documentation. To find specific supported SQL operators, see SqlLibraryOperators.
Pinot 1.0
In Pinot 1.0, the multi-stage query engine supports inner join, left-outer, semi-join, and nested queries out of the box. It's optimized for in-memory process and latency. For more information, see how to enable and use the multi-stage query engine.
Pinot also supports using simple Data Definition Language (DDL) to insert data into a table from file directly. For details, see programmatically access the multi-stage query engine. More DDL supports will be added in the future. But for now, the most common way for data definition is using the Controller Admin API.
Note: For queries that require a large amount of data shuffling, require spill-to-disk, or are hitting any other limitations of the multi-stage query engine (v2), we still recommend using Presto.
Identifier vs Literal
In Pinot SQL:
Double quotes(") are used to force string identifiers, e.g. column names
Single quotes(') are used to enclose string literals. If the string literal also contains a single quote, escape this with a single quote e.g
'''Pinot'''
to match the string literal'Pinot'
Misusing those might cause unexpected query results, like the following examples:
WHERE a='b'
means the predicate on the columna
equals to a string literal value'b'
WHERE a="b"
means the predicate on the columna
equals to the value of the columnb
If your column names use reserved keywords (e.g. timestamp
or date
) or special characters, you will need to use double quotes when referring to them in queries.
Note: Define decimal literals within quotes to preserve precision.
Example Queries
Selection
Aggregation
Grouping on Aggregation
Ordering on Aggregation
Filtering
For performant filtering of IDs in a list, see Filtering with IdSet.
Filtering with NULL predicate
Selection (Projection)
Ordering on Selection
Pagination on Selection
Note that results might not be consistent if the ORDER BY
column has the same value in multiple rows.
Wild-card match (in WHERE clause only)
The example below counts rows where the column airlineName
starts with U
:
Case-When Statement
Pinot supports the CASE-WHEN-ELSE
statement, as shown in the following two examples:
UDF
Pinot doesn't currently support injecting functions. Functions have to be implemented within Pinot, as shown below:
For more examples, see Transform Function in Aggregation Grouping.
BYTES column
Pinot supports queries on BYTES column using hex strings. The query response also uses hex strings to represent bytes values.
The query below fetches all the rows for a given UID:
Last updated