v0.30.0
Quick Start
Visit the Brim Download page to find the package for your OS platform.
Zed is distributed as a ZIP of command line binaries for each supported platform. To install, unpack with the unzip utility for your OS. For example, on Linux:
curl -OL https://github.com/brimdata/zed/releases/download/v0.30.0/zed-v0.30.0.linux-amd64.zip
unzip zed-v0.30.0.linux-amd64.zip
Note that if you've also installed the Brim desktop app, a set of Zed binaries is already unpacked as part of the app installation. If you intend to use Zed at the command line to work with data in the Zed lake that's behind by Brim, it is recommended to use the binaries there were unpacked with the app, since these have been tested with that app release. See this Brim wiki article for details regarding their location.
Release Notes
As you can see below, there's been many changes since the last Zed GA release! Highlights include:
- The introduction of Zed lakes for data storage, which include powerful Git-like branching. See the Zed lake README for details.
- Enhancements to the Zed language to unify search and expression syntax, introduce new operators and functions for data exploration and shaping, and more! Review the Zed language docs for details.
The exhaustive set of changes is listed below. Come talk to us on Slack if you have additional questions.
- Revise Zed language to unify search and expression syntax (#2072, #2152, #2252, #2304, #2294)
- Add
join()
andsplit()
functions for use on strings (#2098) - Add array slice expressions (#2100)
- Fix an issue with connection resets after several minutes when posting data to S3 (#2106)
- Fix an issue with parsing IPv6 literals (#2112)
- Make the
fuse
operator work on nested records (#2052) - Fix an issue where
cut(.)
could cause aslice bounds out of range
panic (#2107) - Add
is()
,fields()
, andexists()
functions (#2131) - Add auto-detection of ZSON format (#2123)
- Fix an issue where
cut
to the root would exit if the referenced field was missing from a record (#2121) - Fix an issue where
put
to the root would panic on a non-record field (#2136) - Add support for parsing map types in ZSON (#2142)
- Add a
fuse()
aggregate function (#2115) - Remove backward compatibility with alpha ZNG format (#2158)
- Simplify ZSON by dropping type decorators when a complex value is fully implied (#2160)
- Add a
switch
operator to allow branched processing (#2087, #2364, #2318, #2336) - Add constants and type literals to the Zed language (#2181)
- The
-I
option inzq
is now used for file includes (and allows multiple files), while-z
now used for compact ZSON output (#2180, #2208) - Add support for shaping arrays and sets (#2173)
- Fix an issue where outer aliases were being lost when ZSON was read into ZNG (#2189)
- Add the
sample
operator that returns an example value for a named field, or for each unique record type (#2200, #2211, #2623) - Make the current record (i.e.,
this
or.
) an implicit argument toshape()
(#2199) - Begin deprecating current TZNG format in favor of ZSON (#2208, #2312, #2333, #2338, #2337, #2339, #2340, #2355, #2367, #2377, #2387, #2388, #2389, #2395, #2477, #2485, #2480, #2513, #2520)
- Fix an issue where accidentally reading non-Zed binary data caused a
zq
panic (#2206) - Fix an issue where time-sorted aggregations were returning non-deterministic results (#2220)
- Add canonical Zed and the
summarize
operator as an explicit keyword before invoking aggregate functions (#2217, #2378, #2430, #2698) - Add support for casting the
duration
type (#2194) - Extend
join
to supportinner
(now the default),left
, andright
variations (#2210) - Fix an issue where Zed would not compile on FreeBSD (#2233)
- Add the
zson_parse()
function (#2242) - Fix an issue where filenames containing
:
could not be read (#2240) - Handle aliases and typedefs in shaper functions, which also fixes a panic (#2257)
- Improve Zeek reader performance (#2265, #2268)
- Fix an issue where
const
references were not honored during query execution (#2260) - Fix an issue where shapers did not handle aliases to different castable types (#2280)
- Add an
unflatten()
function that turns fields with dot-separated names into fields of nested records (#2277) - Fix an issue where querying an index in a Zed lake did not return all matched records (#2273)
- Accept type definition names and aliases in shaper functions (#2289)
- Add a reference shaper for Zeek data (#2300, #2368, #2448, #2489, #2601)
- Fix an issue where accessing a
null
array element in aby
grouping caused a panic (#2310) - Add support for parsing timestamps with offset format
±[hh][mm]
(#2297) - Remove cropping from
shape()
(#2309) - Apply a Zed shaper when reading Suricata EVE data, instead of legacy JSON typing (#2298, #2370, #2400)
- Add support for reading comma-separated value (CSV) files (#2317, #2858, #2942, #2963)
- Fix an issue where reading a Zeek TSV log line would cause a panic if it contained too few fields (#2325)
- Add a
shape
operator, which is useful for cleaning up CSV inputs (#2327) - Fix an issue where querying a Zed lake index for a named field could cause a panic (#2319)
- Make casting to
time
andduration
types more flexible (#2334, #2442) - Fix an issue where
null
values were not output consistently in a group-by aggregation (#2363) - Fix an issue where the confirmation messages from adding an index were sometimes incomplete (#2361)
- Finalize ZSON
duration
format to be an extension of durations in Prometheus (#2358, #2371, #2381, #2396, #2405) - Add functions
missing()
,has()
, andnameof()
(#2393, #2708) - Add prototype support for SQL expressions (#2392)
- Allow type definitions to be redefined (#2386)
- Fix an issue where casting to a named type caused the loss of the type definition name (#2384)
- Add support for Parquet output and rework the Parquet reader (#2227)
- Don't interpret the first
zq
argument as a query if there are no additional arguments (#2382) - Fix an issue that was preventing the reference in an expression to a field name containing a
.
(#2407) - Add support for ISO time literals and support durations and time literals in expressions (#2406)
- Add support for complex literals (#2403)
- Code/repo reorganization for phasing out "ZQL" or "Z" in favor of "Zed language", or just "Zed" if context allows (#2416, #2431, #2455, #2831)
- Support
in
with themap
data type (#2421) - Normalize map values created from Zed expressions (#2423)
- Switch to function-style casting (e.g.,
int64(123)
instead of123:int64
) (#2427, #2438) - Allow shapers to to refer to the contents of input records to determine the type to apply (#2426)
- Fix an issue where referencing a non-existent table in a SQL query caused a panic (#2432)
- Accept
-
(stdin) as azapi
argument for loading data (#2435) - Fix an issue where a single bad cast could cause input processing to halt (#2446)
- Create the
zed
command with sub-commands likequery
andapi
, but shortcut commands (e.g.,zq
,zapi
) still remain (#2450, #2465, #2466, #2463, #2624, #2620) - Rename
ZAR_ROOT
environment variable toZED_LAKE_ROOT
(#2469) - Revise the top-level Zed README to reflect reorganization of the repo and new/changed tools (#2461)
- Remove the
-P
flag fromzq
in favor of usingfrom
in the Zed language (#2491) - Add casting of the
net
data type (#2493, #2496) zq
now reads its inputs sequentially rather than the prior merged behavior (#2492)- Extend the
len()
function to return the number of fields in a record (#2494) - Remove the
-E
flag inzed
commands that displayedtime
values as epoch (#2495) - Add the Zed lake design README document (#2500, #2569, #2595, #2781, #2940, #3014, #3034, #3035)
- Fix an issue where escaping quotes caused a parse error (#2510)
- Fix an issue where multiple ZSON type definitions would be output when only the first was needed (#2511)
- Use less buffer when decoding ZSON (#2515)
- Allow aliases of all primitive types to be expressed in ZSON (#2519)
- Revert the "auto-fuse CSV" behavior originally added in #1908 (#2522)
- Add support for Git-style Zed lakes (#2548, #2556, #2562, #2563, #2564, #2566, #2571, #2577, #2580, #2616, #2613, #2738, #2763, #2806, #2808, #2811, #2816, #2860, #2861, #2931, #2944, #2954, #2960, #2976, #2994, #3007, #3013, #3020, #3023, #3024, #3026, #3030, #3031, #3039, #3046)
- Add support for reading JSON format input data via
-i json
(#2573, #2608) - Remove the legacy approach for applying Zed types to NDJSON input, as this is now done via Zed shapers (#2587)
- Fix a Go client issue where ZNG marshal of unexported struct fields caused a panic (#2589)
- Show a warning rather than failing when an unset value tries to be
cut
to the root (#2591) - Standardize
-h
usage in Zed CLI tools for showing help text (#2596, #2618) - Fix an issue where type names that started with primitive type names caused parse errors (#2612)
- Colorize
zson -Z
output (#2621) - Remove pcap-related code, as this functionality has been moved to Brimcap (#2632)
- The role previously performed by
zqd
is now handled byzed lake serve
(#2629, #2722) - Revise ZJSON to encode types and type values using JSON structure instead of ZSON type strings (#2526)
this
can now be used to reference the current top-level record (formerly.
, which may be deprecated in the future) (#2650)- Rework dataflow model and Zed compiler optimizations (#2669)
- Add initial
explode
operator that can break values from complex fields out into separate records (#2673) - Fix an issue where including a particular
time
-typed field in a shaper script caused errors with shaping other fields (#2685) - Silently discard duplicate fields when reading NDJSON records, which works around Suricata bug 4016 (#2691)
- Fix an issue where ZSON type values were output without parentheses (#2700)
- Swallow single-backslash-escaped
/
when reading NDJSON, which allows for reading default Suricata EVE output (#2697) - Improve the error message shown when no Zed lake root is specified (#2701, #2739)
- Require
on
injoin
syntax (#2698) - Add a
typeunder()
function that returns the concrete type underlying a named type (#2709) - Improve ZNG scanner performance via multi-threading (#2678, #2682)
- Fix an issue where a shaper created a corrupt
time
-typed value from an invalid timestamp rather than rejecting it (#2705) - Simplify keyword search by requiring
:=
for assignment,==
for comparison, and usingmatches
for regex & glob match (#2692, #2744, #2773) - Allow reading data from
http://
andhttps://
targets (#2723, #2732) - Support for arbitrary pool keys in Zed lakes (#2729, #2752)
- Add API docs for the Zed lake service (#2679)
- Support
from file
in Zed language inzq
, which is particularly useful withjoin
(#2753) - Fix an issue where certain data could be queried successfully via
zq
but not if loaded into a Zed lake pool (#2755) - Revise Python client docs to show double quotes during
pip
install, since Windows needs that (#2758) - Fix an issue where a query was incorrectly parallelized by merging on the wrong key (#2760)
- Fix an issue where
len()
of anull
array was evaluating to something greater than zero (#2761) - Fix an issue where
sort
with no fields was ignoring alias types and nested fields when picking a sort field (#2762) - Fix an issue where unexpected
cut: no record found
warnings were returned byzed lake query
but not when the same data was queried viazq
(#2764) - Move and extend the Zeek interoperability docs (#2770, #2782, #2830)
- Create endpoints in the Zed lake service API that correspond to underlying Zed lake operations, and expose them via
zapi
commands (#2741, #2774, #2786, #2775, #2794, #2795, #2796, #2920, #2925, #2928) - Fix an issue where
zq
would surface a syntax error when reading ZSON it had sent as output (#2792) - Add an
/events
endpoint to the API, which can be used by clients such as the Brim app to be notified of pool updates (#2791) - Simplify the ZSON
enum
type by removing the values from the list of symbols (#2820) - Add Zed language documentation for the
join
operator (#2836) - Fix an issue where reading ZNG input with more than 222 type definitions triggered a
zng type ID out of range
error (#2847) - Have
put
only return thea referenced field is missing
error on first occurrence (#2843) - Fix an issue where a
zed lake query
triggered asend on closed channel
panic (#2842) - Allow casting to
bool
type (#2840) - Fix an issue where
zq
would surface an error when reading ZST it had sent as output (#2854) - Fix an issue where backend errors triggered by
zapi query
were not being surfaced (#2859) - Have the Python client use the
/query
endpoint for the Zed lake (#2869) - Minimize the amount of surrounding context shown when reporting parse errors (#2864)
- Field assignments in
join
now behave likecut
instead ofpick
(#2868) - Add more background/context to Zed top-level language README (#2866 #2878, #2901)
- Unify
from
,split
, andswitch
syntax to the forms shown here (#2871, #2896) - Shapers can now cast values of the
null
type to any type (e.g., arrays or records) (#2882) - Fix an issue where
join
was failing to match on values of comparable types (e.g.,string
andbstring
) (#2880, #2884) - Shapers can now cast a value to a
union
type (#2881) - Introduce alternate
switch
syntax (#2888, #3004) - When
fuse
encounters a field with the same name but different types, it now creates one field ofunion
type rather than separate, uniquely-named fields (#2885, #2886) - Fix an issue where
fuse
would consume too much memory when fusing many types (#2897, #2899) - Emphasize in the
sort
documentation that its output can be non-deterministic in the absence of an explicit field list (#2902) - Remove the space separator before decorator in ZSON
-z
output (#2911) - Fix an issue where handling of record alises caused a failure to shape Zeek NDJSON data (#2904)
- Fix an issue where posting garbage input data to a pool caused an HTTP 500 response (#2924)
- Fix an issue where reading a ZNG file and outputting as CSV caused a deadlock (#2929)
- In a
from
clause,range
is now used instead ofover
to specify a range scan over a data source (#2943) - Fix a Zed language issue with parsing parenthesized search terms (#2951)
- Column headers in
-f table
outputs now reflect the case of the field name rather than always being uppercase (#2964) - Reserved words in the Zed language can now be used in more places (e.g., field name references) without risk of collisions that would require escaping (#2968)
- Zed CLI tools now send human-readable ZSON by default if output is to a terminal, otherwise binary ZNG (#2979, #2985)
- Temporary directories for spill-to-disk operations now are prefixed with
zed-spill-
rather thanzq-spill-
(#2980) - The
put
operator keyword is now optional (e.g., can writex:=1
instead ofput x:=1
) (#2967, #2986, #3043) - Fix an issue where a
put
on a nested record with an alias triggered a panic (#2990) - Fix an issue where temporary spill-to-disk directories were not being deleted upon exit (#3009, #3010)
- Fix a ZSON issue with
union
types with alias decorators (#3015, #3016) - The ZSON format has been changed such that integer type IDs are no longer output (#3017)
- Update the reference Zed shaper for Zeek (shaper, docs) to reflect changes in Zeek release v4.1.0 (#3021)
- Fix an issue where backslash escapes in Zed regular expressions were not accepted (#3040)
- The ZST format has been updated to work for typedef'd outer records (#3047)
- Fix an issue where an empty string could not be output as a JSON field name (#3054)