Using ITERATOR
SELECT [DISTINCT] { <field name>, ... }
[ ISTREAM ]
FROM ITERATOR
(<nested collection name>.<member name>[, <type>])
<iterator name>,
<nested collection name>Usage | Description |
|---|---|
|
|
|
|
The ITERATOR function allows you to access the members of nested collections in a dataset, so long as the collection implements the java.lang.Iterable interface or is a JsonNode.
For example, suppose you have the following statement:
create stream s1 (
id string,
json_array JsonNode,
list_of_objects java.util.List
);The json_array and list_of_objects are both nested data collections.
Since java.util.List implements the java.lang.Iterable interface, you can create an iterator and use it to access the members of list_of_objects :
SELECT lst from s1, ITERATOR(s1.list_of_objects) lst;
Suppose the list_of_objects contains objects of this Java type:
package my.package;
class MyType {
int attrA;
int attrB;
}You would access its members using this statement:
SELECT attrA, attrB FROM s1, ITERATOR(s1.list_of_objects, my.package.MyType) lst;
The stream also includes a JsonNode member. Suppose the following events are added to the stream:
('a', [1,2,3], null)
('b', [1,3,4], null)Here is how you can iterate through json_array:
SELECT id, a FROM s1, iterator(s1.json_array) a; OUTPUT: ======= a 1 a 2 a 3 b 1 b 3 b 4
This statement illustrates a cross join between json_array and list_of_objects:
SELECT a, b FROM ITERATOR(s1.json_array) a, ITERATOR(s1.list_of_objects) b, s1;
You can iterate through multiple levels of nesting. For example, this statement iterates through 2 levels, where json_array contains another_nested_collection:
SELECT x FROM s1, ITERATOR(s1.json_array) a, ITERATOR(a.another_nested_collection) x;
Warning
Arbitrary data types, such as a Java List, cannot be used with a WActionStore that is persisted to Elasticsearch. Also, it is not possible to convert a JSON List into a Java List.