Open
Description
Is your feature request related to a problem?
We need to enhance OpenSearch PPL (Piped Processing Language) by adding support for JSON-based operations. This extension will provide users with powerful tools to manipulate and analyze JSON data within PPL queries.
Proposed New Functions
json_object()
: Creates a JSON object from existing key/value pairs.
... | eval person = json_object("name", "John", "age", 30)
json()
: Evaluates whether a value can be parsed as JSON. Returns the value if valid, null otherwise.
... | eval result = json('{"name":"John","age":30}')
json_append()
: Appends elements to the contents of a valid JSON object.
... | eval person = json_object("name", "John"), extended_person = json_append(person, "city", "New York")
json_array()
: Creates a JSON array using a list of values.
... | eval json_list = json_array("apple", "banana", "cherry")
json_array_to_mv()
: Maps the elements of a JSON array to a multivalued field.
... | eval json_list = json_array("apple", "banana", "cherry"), mv_field = json_array_to_mv(json_list)
json_delete()
: Removes one or more keys and their corresponding values from the specified JSON object.
... | eval person = json_object("name", "John", "age", 30, "city", "New York"), person_no_age = json_delete(person, "age")
json_extend()
: Extends the contents of a valid JSON object with the values of an array.
... | eval person = json_object("name", "John", "age", 30), extended_person = json_extend(person, json_array("city", "New York"))
json_extract()
: Returns either a JSON array or a native type value from a field and zero or more paths.
... | eval data = json('{"person": {"name": "John", "age": 30}}'), name = json_extract(data, "person.name")
json_keys()
: Returns the keys from the key-value pairs in a JSON object as a JSON array.
... | eval person = json_object("name", "John", "age", 30), keys = json_keys(person)
json_set()
: Inserts or overwrites values for a JSON node with provided values and returns an updated JSON object.
... | eval person = json_object("name", "John"), updated_person = json_set(person, "age", 30)
json_valid()
: Evaluates whether a JSON object uses valid JSON syntax and returns TRUE or FALSE.
... | eval is_valid = json_valid('{"name":"John","age":30}')
all()
: Iterates over JSON array values and returns true if every value matches the provided predicate.
... | eval json_list = json_array(1, 2, 3), all_match = all(json_list, val -> val != 0)
any()
: Iterates over JSON array values and returns true if any value matches the provided predicate.
... | eval json_list = json_array(1, 2, 3), any_match = any(json_list, val -> val == 0)
filter()
: Iterates over JSON array values and performs an operation on each value.
... | eval json_list = json_array(1, 2, 3, 4), filtered_list = filter(json_list, val -> val % 2 == 0)
map()
: Iterates over JSON array values and performs an operation on each value.
... | eval json_list = json_array(1, 2, 3), mapped_list = map(json_list, val -> val * 2)
reduce()
: Iterates over a JSON array in a field or a literal array and performs an accumulation operation.
... | eval json_list = json_array(1, 2, 3), sum = reduce(json_list, 0, (acc, val) -> acc + val)
Technical Considerations
- Consider leveraging existing JSON libraries for efficient parsing and manipulation.
- Ensure that these functions can handle large JSON objects without significant performance degradation.
Metadata
Metadata
Assignees
Type
Projects
Status
Done