For the complete documentation index, see llms.txt. This page is also available as Markdown.

JSONiq coverage

RumbleDB relies on the JSONiq language.

JSONiq reference

The complete specification can be found here and on the JSONiq.org website. The implementation is now complete and all JSONiq features are supported including Update and Scripting.

JSONiq tutorial

A tutorial can be found here. All queries in this tutorial will work with RumbleDB.

JSONiq tutorial for Python users

A tutorial aimed at Python users can be found here.

Nested FLWOR expressions

FLWOR expressions support nestedness, for example like so:

let $x := for $x in json-lines("file.json")
          where $x.field eq "foo"
          return $x
return count($x)

However, keep in mind that parallelization cannot be nested in Spark (there cannot be a job within a job), that is, the following will not work:

Expressions pushed down to Spark

Many expressions are pushed down to Spark out of the box. For example, this will work on a large file leveraging the parallelism of Spark:

Examples of what is pushed down and efficiently computed:

  • FLWOR expressions (as soon as a for clause is encountered, binding a variable to a sequence generated with json-lines() or parallelize())

  • aggregation functions such as count

  • JSON navigation expressions: object lookup (as well as keys() call), array lookup, array unboxing, filtering predicates

  • predicates on positions, include use of context-dependent functions position() and last(), e.g.,

  • type checking (instance of, treat as)

  • many builtin function calls (head, tail, exist, etc)

We can push down even more expressions in the future, prioritized on the feedback we receive.

We also push down many expressions to DataFrames and Spark SQL (e.g. after structured-json-lines, csv-file and parquet-file calls). In particular, keys() pushes down the schema lookup if used on parquet-file() and structured-json-lines(). Likewise, count() as well as object lookup, array unboxing and array lookup is also pushed down on DataFrames.

When an expression does not support pushdown, it will materialize automatically. The materialization is capped by default at 100000 items, but this can be changed on the command line with --materialization-cap. See the configuration page to see how to do it in Python or Java. The separate --result-size option controls the display limit (default: 10). An error is thrown if the materialization cap is exceeded within a query.

External global variables.

Prologs with user-defined functions and global variables are supported. Global external variables are supported (use --variable foo=bar on the command line to assign values to them). If the declared type is not string, then the literal supplied on the command line is cast. If the declared type is anyURI, the path supplied on the command line is also resolved against the working directory to an absolute URI. Thus, anyURI should be used to supply paths dynamically through an external variable.

Context item declarations are supported and a global context item value can be passed with the "--context-item" or "-I" parameter on the command line.

Library modules

Library modules are supported including location hints. If the provided path is relative, it is resolved against the importing module location.

The same schemes are supported as for reading queries and data: file, hdfs, and so on. HTTP is also supported: you can import modules from the Web!

Example of library module (the file name is library-module.jq):

Example of importing module (assuming it is in the same directory):

Supported types

The JSONiq type system is fully supported. Below is a complete list of JSONiq types and their support status. All builtin types are in the default type namespace, so that no prefix is needed. These types are defined in the XML Schema standard.

All types specific to XML (e.g., NOTATION, NMTOKENS, NMTOKEN, ID, IDREF, ENTITY, etc) are also supported in JSONiq.

Type
Status

atomic

JSONiq 1.0 only

anyAtomicType

supported

anyURI

supported

base64Binary

supported

boolean

supported

byte

supported

date

supported

dateTime

supported

dateTimeStamp

supported

dayTimeDuration

supported

decimal

supported

double

supported

duration

supported

float

supported

gDay

supported

gMonth

supported

gYear

supported

gYearMonth

supported

hexBinary

supported

int

supported

integer

supported

long

supported

negativeInteger

supported

nonPositiveInteger

supported

nonNegativeInteger

supported

numeric

supported

positiveInteger

supported

short

supported

string

supported

time

supported

unsignedByte

supported

unsignedInt

supported

unsignedLong

supported

unsignedShort

supported

yearMonthDuration

supported

Newly supported features in RumbleDB 3.0

Prolog

All prolog settings are supported.

FLWOR features

Tumbling and sliding windows are supported.

Function types

Function type syntax is supported as well as annotations (like %public, %private).

Builtin functions

The vast majority of building functions is supported including all optional parameters and flags. There are very few exceptions such as functions invoking XSLT, which RumbleDB does not support, or dynamically loading a module.

XML-specific functions are also all available in JSONiq.

Buitin functions can now also be used with named function reference expressions (example: concat#2).

Error variables

Error variables ($err:code, ...) for inside catch blocks are fully supported.

Updates and scripting

Updates and scripting are fully supported, with Delta Lake and Apache Iceberg as supported persistence layers.

Last updated