This is an automated email from the ASF dual-hosted git repository.

alamb pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/arrow-site.git


The following commit(s) were added to refs/heads/main by this push:
     new 2a239bfcdee [Website]: Blog post about arrow-avro Rust crate (#712)
2a239bfcdee is described below

commit 2a239bfcdeed9e2e10c8ce4907e85bfd86ed30a3
Author: Connor Sanders <[email protected]>
AuthorDate: Thu Oct 23 13:27:13 2025 -0500

    [Website]: Blog post about arrow-avro Rust crate (#712)
    
    Part of the work to add first class Avro support to arrow-rs is to tell
    people about it:
    
    - Closes: https://github.com/apache/arrow-rs/issues/8428
    - Part of https://github.com/apache/arrow-rs/issues/4886
    
    @alamb Here's my first pass at the blog post. Sorry about it taking it a
    bit longer than anticipated. Let me know what you think and I'm 100%
    down to collaborate on this. 😃
    
    ---------
    
    Co-authored-by: Andrew Lamb <[email protected]>
---
 _data/contributors.yml                             |   3 +
 _posts/2025-10-23-introducing-arrow-avro.md        | 268 +++++++++++++++++++++
 .../arrow-avro-architecture.svg                    |   1 +
 img/introducing-arrow-avro/read_violin_10k.svg     |  79 ++++++
 img/introducing-arrow-avro/read_violin_1m.svg      |  79 ++++++
 img/introducing-arrow-avro/write_violin_10k.svg    |  65 +++++
 img/introducing-arrow-avro/write_violin_1m.svg     |  71 ++++++
 7 files changed, 566 insertions(+)

diff --git a/_data/contributors.yml b/_data/contributors.yml
index 9591d2bc959..8cefa315122 100644
--- a/_data/contributors.yml
+++ b/_data/contributors.yml
@@ -70,6 +70,9 @@
 - name: Rossi Sun
   apacheId: zanmato
   githubId: zanmato1984
+- name: Connor Sanders
+  apacheId: jecsand838 # Not a real apacheId
+  githubId: jecsand838
 - name: Andrew Lamb
   apacheId: alamb
   githubId: alamb
diff --git a/_posts/2025-10-23-introducing-arrow-avro.md 
b/_posts/2025-10-23-introducing-arrow-avro.md
new file mode 100644
index 00000000000..da6d0e65285
--- /dev/null
+++ b/_posts/2025-10-23-introducing-arrow-avro.md
@@ -0,0 +1,268 @@
+---
+layout: post
+title: "Announcing arrow-avro in Arrow Rust"
+description: "A new native Rust vectorized reader/writer for Avro to Arrow, 
with OCF, Single‑Object, and Confluent wire format support."
+date: "2025-10-23 00:00:00"
+author: jecsand838
+categories: [application]
+---
+<!--
+{% comment %}
+Licensed to the Apache Software Foundation (ASF) under one or more
+contributor license agreements.  See the NOTICE file distributed with
+this work for additional information regarding copyright ownership.
+The ASF licenses this file to you under the Apache License, Version 2.0
+(the "License"); you may not use this file except in compliance with
+the License.  You may obtain a copy of the License at
+
+http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+{% endcomment %}
+-->
+
+[`arrow-avro`], a newly rewritten Rust crate that reads and writes [Apache 
Avro](https://avro.apache.org/) data directly as Arrow `RecordBatch`es, is now 
available. It supports [Avro Object Container 
Files](https://avro.apache.org/docs/1.11.1/specification/#object-container-files)
 (OCF), [Single‑Object 
Encoding](https://avro.apache.org/docs/1.11.1/specification/#single-object-encoding)
 (SOE), the [Confluent Schema Registry wire 
format](https://docs.confluent.io/platform/current/schema-re [...]
+
+[`arrow-avro`]: https://crates.io/crates/arrow-avro
+
+## Motivation
+
+Apache Avro’s row‑oriented design is effective for encoding one record at a 
time, while Apache Arrow’s columnar layout is optimized for vectorized 
analytics. A major challenge lies in converting between these formats without 
reintroducing row‑wise overhead. Decoding Avro a row at a time and then 
building Arrow arrays incurs extra allocations and cache‑unfriendly access (the 
very costs Arrow is designed to avoid). In the real world, this overhead 
commonly shows up in analytical hot paths. [...]
+
+### Why not use the existing `apache-avro` crate?
+
+Rust already has a mature, general‑purpose Avro crate, 
[apache-avro](https://crates.io/crates/apache-avro). It reads and writes Avro 
records as Avro value types and provides Object Container File readers and 
writers. What it does not do is decode directly into Arrow arrays, so any Arrow 
integration must materialize rows and then build columns.
+
+What’s needed is a complementary approach that decodes column‑by‑column 
straight into Arrow builders and emits `RecordBatch`es. This would enable 
projection pushdown while keeping execution vectorized end to end. For projects 
such as [Apache DataFusion](https://datafusion.apache.org/), access to a 
mature, upstream Arrow‑native reader and writer would help simplify the code 
path and reduce duplication.
+
+Modern pipelines heighten this need because [Avro is also used on the 
wire](https://www.confluent.io/blog/avro-kafka-data/), not just in files. Kafka 
ecosystems commonly use Confluent’s Schema Registry framing, and many services 
adopt the Avro Single‑Object Encoding format. An approach that enables decoding 
straight into Arrow batches (rather than through per‑row values) would let 
downstream compute remain vectorized at streaming rates.
+
+### Why this matters
+
+Apache Avro is a first‑class format across stream processors and cloud 
services:
+- Confluent Schema Registry supports [Avro across multiple languages and 
tooling](https://docs.confluent.io/platform/current/schema-registry/fundamentals/serdes-develop/serdes-avro.html).
+- Apache Flink exposes an [`avro-confluent` format for 
Kafka](https://nightlies.apache.org/flink/flink-docs-release-1.19/docs/connectors/table/formats/avro-confluent/).
+- AWS Lambda [(June 2025) added native handling for Avro‑formatted Kafka 
events](https://aws.amazon.com/about-aws/whats-new/2025/06/aws-lambda-native-support-avro-protobuf-kafka-events/)
 with Glue and Confluent Schema Registry integrations.
+- Azure Event Hubs provides a [Schema Registry with Avro 
support](https://learn.microsoft.com/en-us/azure/event-hubs/schema-registry-overview)
 for Kafka‑compatible clients.
+
+In short: Arrow users encounter Avro both on disk (OCF) and on the wire (SOE). 
An Arrow‑first, vectorized reader/writer for OCF, SOE, and Confluent framing 
removes a pervasive bottleneck and keeps pipelines columnar end‑to‑end.
+
+## Introducing `arrow-avro`
+
+[`arrow-avro`](https://github.com/apache/arrow-rs/tree/main/arrow-avro) is a 
high-performance Rust crate that converts between Avro and Arrow with a 
column‑first, batch‑oriented design. On the read side, it decodes Avro Object 
Container Files (OCF), Single‑Object Encoding (SOE), and the Confluent Schema 
Registry wire format directly into Arrow `RecordBatch`es. Meanwhile, the write 
path provides formats for encoding to OCF and SOE as well.
+
+The crate exposes two primary read APIs: a high-level `Reader` for OCF inputs 
and a low-level `Decoder` for streaming SOE frames. For SOE and 
Confluent/Apicurio frames, a `SchemaStore` is provided that resolves 
fingerprints or schema IDs to full Avro writer schemas, enabling schema 
evolution while keeping the decode path vectorized.
+
+On the write side, `AvroWriter` produces OCF (including container‑level 
compression), while `AvroStreamWriter` produces framed Avro messages for 
Single‑Object or Confluent/Apicurio encodings, as configured via the 
`WriterBuilder::with_fingerprint_strategy(...)` knob.
+
+Configuration is intentionally minimal but practical. For instance, the 
`ReaderBuilder` exposes knobs covering both batch file ingestion and streaming 
systems without forcing format‑specific code paths.
+
+### How this mirrors Parquet in Arrow‑rs
+
+If you have used Parquet with Arrow‑rs, you already know the pattern. The 
`parquet` crate exposes a [parquet::arrow 
module](https://docs.rs/parquet/latest/parquet/arrow/index.html) that reads and 
writes Arrow `RecordBatch`es directly. Most users reach for 
`ParquetRecordBatchReaderBuilder` when reading and `ArrowWriter` when writing. 
You choose columns up front, set a batch size, and the reader gives you Arrow 
batches that flow straight into vectorized operators. This is the widely adopte 
[...]
+
+`arrow‑avro` brings that same bridge to Avro. You get a single `ReaderBuilder` 
that can produce a `Reader` for OCF, or a streaming `Decoder` for on‑the‑wire 
frames. Both return Arrow `RecordBatch`es, which means engines can keep 
projection and filtering close to the reader and avoid building rows only to 
reassemble them back into columns later. For evolving streams, a small 
`SchemaStore` resolves fingerprints or ids before decoding, so the batches that 
come out are already shaped for vec [...]
+
+The reason this pattern matters is straightforward. Arrow’s columnar format is 
designed for vectorized work and good cache locality. When a format reader 
produces Arrow batches directly, copies and branchy per‑row work are minimized, 
keeping downstream operators fast. That is the same story that made 
`parquet::arrow` popular in Rust, and it is what `arrow‑avro` now enables for 
Avro.
+
+
+## Architecture & Technical Overview
+
+<div style="display: flex; gap: 16px; justify-content: center; align-items: 
flex-start; padding: 20px 15px;">
+<img src="{{ site.baseurl 
}}/img/introducing-arrow-avro/arrow-avro-architecture.svg"
+        width="100%"
+        alt="High-level `arrow-avro` architecture"
+        style="background:#fff">
+</div>
+
+At a high level, 
[arrow-avro](https://arrow.apache.org/rust/arrow_avro/index.html) splits 
cleanly into read and write paths built around Arrow `RecordBatch`es. The read 
side turns Avro (OCF files or framed byte streams) into batched Arrow arrays, 
while the write side takes Arrow batches and produces OCF files or streaming 
frames. When using an `AvroStreamWriter`, the framing (SOE or Confluent) is 
part of the stream output based on the configured fingerprint strategy; thus no 
separate fra [...]
+
+On the [read](https://arrow.apache.org/rust/arrow_avro/reader/index.html) 
path, everything starts with the 
[ReaderBuilder](https://arrow.apache.org/rust/arrow_avro/reader/struct.ReaderBuilder.html).
 A single builder can create a 
[Reader](https://arrow.apache.org/rust/arrow_avro/reader/struct.Reader.html) 
for Object Container Files (OCF) or a streaming 
[Decoder](https://arrow.apache.org/rust/arrow_avro/reader/struct.Decoder.html) 
for SOE/Confluent/Apicurio frames. The `Reader` pulls OCF b [...]
+
+When reading an OCF, the `Reader` parses a header and then iterates over 
blocks of encoded data. The header contains a metadata map with the embedded 
Avro schema and optional compression (i.e., `deflate`, `snappy`, `zstd`, 
`bzip2`, `xz`), plus a 16‑byte sync marker used to delimit blocks. Each 
subsequent OCF block then carries a row count and the encoded payload. The 
parsed OCF header and block structures are also encoded with variable‑length 
integers that use zig‑zag encoding for signed [...]
+
+On the [write](https://arrow.apache.org/rust/arrow_avro/writer/index.html) 
path, the 
[WriterBuilder](https://arrow.apache.org/rust/arrow_avro/writer/struct.WriterBuilder.html)
 produces either an 
[AvroWriter](https://arrow.apache.org/rust/arrow_avro/writer/type.AvroWriter.html)
 (OCF) or an 
[AvroStreamWriter](https://arrow.apache.org/rust/arrow_avro/writer/type.AvroStreamWriter.html)
 (SOE/Message). The `with_compression(...)` knob is used for OCF block 
compression while `with_fingerprint_s [...]
+
+Schema handling is centralized in the 
[schema](https://arrow.apache.org/rust/arrow_avro/schema/index.html) module. 
[AvroSchema](https://arrow.apache.org/rust/arrow_avro/schema/struct.AvroSchema.html)
 wraps a valid Avro Schema JSON string, supports computing a `Fingerprint`, and 
can be loaded into a 
[SchemaStore](https://arrow.apache.org/rust/arrow_avro/schema/struct.SchemaStore.html)
 as a writer schema. At runtime, the `Reader`/`Decoder` can use a `SchemaStore` 
to resolve fingerprints be [...]
+
+At the heart of `arrow-avro` is a type‑mapping `Codec` that the library uses 
to construct both encoders and decoders. The `Codec` captures, for every Avro 
field, how it maps to Arrow and how it should be encoded or decoded. The 
`Reader` logic builds a `Codec` per *(writer, reader)* schema pair, which the 
decoder later uses to vectorize parsing of Avro values directly into the 
correct Arrow builders. The `Writer` logic uses the same `Codec` mappings to 
drive pre-computed record encoding p [...]
+
+Finally, by keeping container and stream framing (OCF vs. SOE) separate from 
encoding and decoding, the crate composes naturally with the rest of Arrow‑rs: 
you read or write Arrow `RecordBatch`es, pick OCF or SOE streams as needed, and 
wire up fingerprints only when you're on a streaming path. This results in a 
compact API surface that covers both batch files and high‑throughput streams 
without sacrificing columnar, vectorized execution.
+
+## Examples
+
+### Decoding a Confluent-framed Kafka Stream
+
+```rust
+use arrow_avro::reader::ReaderBuilder;
+use arrow_avro::schema::{
+    SchemaStore, AvroSchema, Fingerprint, FingerprintAlgorithm, CONFLUENT_MAGIC
+};
+
+fn main() -> Result<(), Box<dyn std::error::Error>> {
+    // Register writer schema under Confluent id=1.
+    let mut store = SchemaStore::new_with_type(FingerprintAlgorithm::Id);
+    store.set(
+        Fingerprint::Id(1),
+        
AvroSchema::new(r#"{"type":"record","name":"T","fields":[{"name":"x","type":"long"}]}"#.into()),
+    )?;
+
+    // Define reader schema to enable projection/schema evolution.
+    let reader_schema = 
AvroSchema::new(r#"{"type":"record","name":"T","fields":[{"name":"x","type":"long"}]}"#.into());
+
+    // Build Decoder using reader and writer schemas
+    let mut decoder = ReaderBuilder::new()
+        .with_reader_schema(reader_schema)
+        .with_writer_schema_store(store)
+        .build_decoder()?;
+
+    // Simulate one frame: magic 0x00 + 4‑byte big‑endian schema ID + Avro 
body (x=1 encoded as zig‑zag/VLQ).
+    let mut frame = Vec::from(CONFLUENT_MAGIC); 
frame.extend_from_slice(&1u32.to_be_bytes()); frame.extend_from_slice(&[2]);
+
+    // Consume from decoder
+    let _consumed = decoder.decode(&frame)?;
+    while let Some(batch) = decoder.flush()? {
+        println!("rows={}, cols={}", batch.num_rows(), batch.num_columns());
+    }
+    Ok(())
+}
+```
+
+The `SchemaStore` maps the incoming schema ID to the correct Avro writer 
schema so the decoder can perform projection/evolution against the reader 
schema. Confluent's wire format prefixes each message with a magic byte `0x00` 
followed by a big‑endian 4‑byte schema ID. After decoding Avro messages, the 
`Decoder::flush()` method yields Arrow `RecordBatch`es suitable for vectorized 
processing.
+
+A more advanced example can be found 
[here](https://github.com/apache/arrow-rs/blob/main/arrow-avro/examples/decode_kafka_stream.rs).
+
+### Writing a Snappy Compressed Avro OCF file
+
+```rust
+use arrow_array::{Int64Array, RecordBatch};
+use arrow_schema::{Schema, Field, DataType};
+use arrow_avro::writer::{Writer, WriterBuilder};
+use arrow_avro::writer::format::AvroOcfFormat;
+use arrow_avro::compression::CompressionCodec;
+use std::{sync::Arc, fs::File, io::BufWriter};
+
+fn main() -> Result<(), Box<dyn std::error::Error>> {
+  let schema = Schema::new(vec![Field::new("id", DataType::Int64, false)]);
+  let batch = RecordBatch::try_new(
+    Arc::new(schema.clone()),
+    vec![Arc::new(Int64Array::from(vec![1,2,3]))],
+  )?;
+  let file = File::create("target/example.avro")?;
+
+  // Choose OCF block compression (e.g., None, Deflate, Snappy, Zstd)
+  let mut writer: Writer<_, AvroOcfFormat> = WriterBuilder::new(schema)
+      .with_compression(Some(CompressionCodec::Snappy))
+      .build(BufWriter::new(file))?;
+  writer.write(&batch)?;
+  writer.finish()?;
+  Ok(())
+}
+```
+
+The example above configures an Avro OCF `Writer`. It constructs a `Writer<_, 
AvroOcfFormat>` using `WriterBuilder::new(schema)` and wraps a `File` in a 
`BufWriter` for efficient I/O. The call to 
`.with_compression(Some(CompressionCodec::Snappy))` enables block‑level snappy 
compression. Finally, `writer.write(&batch)?` serializes the batch as an Avro 
encoded block, and `writer.finish()?` flushes and finalizes the outputted file.
+
+## Alternatives & Benchmarks
+
+There are fundamentally two different approaches for bringing Avro into Arrow:
+1. Row‑centric approach, typical of general Avro libraries such as 
`apache-avro`, deserializes one record at a time into native Rust values (i.e., 
`Value` or Serde types) and then builds Arrow arrays from those values.
+2. Vectorized approach, what `arrow-avro` provides, decodes directly into 
Arrow builders/arrays and emits `RecordBatch`es, avoiding most per‑row overhead.
+
+This section compares the performance of both approaches using these 
[Criterion 
benchmarks](https://github.com/jecsand838/arrow-rs/tree/blog-benches/arrow-avro/benches).
+
+### Read performance (1M)
+
+<div style="display: flex; gap: 16px; justify-content: center; align-items: 
flex-start; padding: 5px 5px;">
+<img src="{{ site.baseurl }}/img/introducing-arrow-avro/read_violin_1m.svg"
+        width="100%"
+        alt="1M Row Read Violin Plot"
+        style="background:#fff">
+</div>
+
+### Read performance (10K)
+
+<div style="display: flex; gap: 16px; justify-content: center; align-items: 
flex-start; padding: 5px 5px;">
+<img src="{{ site.baseurl }}/img/introducing-arrow-avro/read_violin_10k.svg"
+        width="100%"
+        alt="10K Row Read Violin Plot"
+        style="background:#fff">
+</div>
+
+### Write performance (1M)
+
+<div style="display: flex; gap: 16px; justify-content: center; align-items: 
flex-start; padding: 5px 5px;">
+<img src="{{ site.baseurl }}/img/introducing-arrow-avro/write_violin_1m.svg"
+        width="100%"
+        alt="1M Row Write Violin Plot"
+        style="background:#fff">
+</div>
+
+### Write performance (10K)
+
+<div style="display: flex; gap: 16px; justify-content: center; align-items: 
flex-start; padding: 5px 5px;">
+<img src="{{ site.baseurl }}/img/introducing-arrow-avro/write_violin_10k.svg"
+        width="100%"
+        alt="10K Row Write Violin Plot"
+        style="background:#fff">
+</div>
+
+
+Across benchmarks, the violin plots show lower medians and tighter spreads for 
`arrow-avro` on both read and write paths. The gap widens when per‑row work 
dominates (i.e., 10K‑row scenarios). At 1M rows, the distributions remain 
favorable to `arrow-avro`, reflecting better cache locality and fewer copies 
once decoding goes straight to Arrow arrays. The general behavior is consistent 
with `apache-avro`'s record‑by‑record iteration and `arrow-avro`'s 
batch‑oriented design.
+
+The table below lists the cases we report in the figures:
+* 10K vs 1M rows for multiple data shapes.
+* **Read cases:**
+    * `f8`: *Full schema, 8K batch size.*
+      Decode all four columns with batch_size = 8192.
+    * `f1`: *Full schema, 1K batch size.*
+      Decode all four columns with batch_size = 1024.
+    * `p8`: *Projected `{id,name}`, 8K batch size (pushdown).*
+      Decode only `id` and `name` with batch_size = 8192`.
+      *How projection is applied:*
+        * `arrow-avro/p8`: projection via reader schema 
(`ReaderBuilder::with_reader_schema(...)`) so decoding is column‑pushed down in 
the Arrow‑first reader.
+        * `apache-avro/p8`: projection via Avro reader schema 
(`AvroReader::with_schema(...)`) so the Avro library decodes only the projected 
fields.
+    * `np`: *Projected `{id,name}`, no pushdown, 8K batch size.*
+      Both readers decode the full record (all four columns), materialize all 
arrays, then project down to `{id,name}` after decode. This models systems that 
can't push projection into the file/codec reader.
+* **Write cases:**
+    * `c` (cold): *Schema conversion each iteration.*
+    * `h` (hot): *Avro JSON "hot" path.*
+* The resulting Apache‑Avro vs Arrow‑Avro medians with the computed speedup.
+
+### Benchmark Median Time Results (Apple Silicon Mac)
+
+| Case     | apache-avro median | arrow-avro median | speedup |
+|----------|-------------------:|------------------:|--------:|
+| R/f8/10K |            2.60 ms |           0.24 ms |  10.83x |
+| R/p8/10K |            7.91 ms |           0.24 ms |  32.95x |
+| R/f1/10K |            2.65 ms |           0.25 ms |  10.60x |
+| R/np/10K |            2.62 ms |           0.25 ms |  10.48x |
+| R/f8/1M  |          267.21 ms |          27.91 ms |   9.57x |
+| R/p8/1M  |          791.79 ms |          26.28 ms |  30.13x |
+| R/f1/1M  |          262.93 ms |          28.25 ms |   9.31x |
+| R/np/1M  |          268.79 ms |          27.69 ms |   9.71x |
+| W/c/10K  |            4.78 ms |           0.27 ms |  17.70x |
+| W/h/10K  |            0.82 ms |           0.28 ms |   2.93x |
+| W/c/1M   |          485.58 ms |          36.97 ms |  13.13x |
+| W/h/1M   |           83.58 ms |          36.75 ms |   2.27x |
+
+## Closing
+
+`arrow-avro` brings a purpose‑built, vectorized bridge connecting Arrow-rs and 
Avro that covers Object Container Files (OCF), Single‑Object Encoding (SOE), 
and the Confluent/Apicurio Schema Registry wire formats. This means you can now 
keep your ingestion paths columnar for both batch files and streaming systems. 
The reader and writer APIs shown above are now available for you to use with 
the v57.0.0 release of `arrow-rs`.
+
+This work is part of the ongoing Arrow‑rs effort to implement first-class Avro 
support in Rust. We'd love your feedback on real‑world use-cases, workloads, 
and integrations. We also welcome contributions, whether that's issues, 
benchmarks, or PRs. To follow along or help, open an [issue on 
GitHub](https://github.com/apache/arrow-rs/issues) and/or track [Add Avro 
Support](https://github.com/apache/arrow-rs/issues/4886) in `apache/arrow-rs`.
+
+### Acknowledgments
+
+Special thanks to:
+* [tustvold](https://github.com/tustvold) for laying an incredible zero-copy 
foundation.
+* [nathaniel-d-ef](https://github.com/nathaniel-d-ef) and 
[ElastiFlow](https://github.com/elastiflow) for their numerous and invaluable 
project-wide contributions.
+* [veronica-m-ef](https://github.com/veronica-m-ef) for making Impala‑related 
contributions to the `Reader`.
+* [Supermetal](https://github.com/Supermetal-Inc) for contributions related to 
Apicurio Registry and Run-End Encoding type support.
+* [kumarlokesh](https://github.com/kumarlokesh) for contributing `Utf8View` 
support.
+* [alamb](https://github.com/alamb), [scovich](https://github.com/scovich), 
[mbrobbel](https://github.com/mbrobbel), and 
[klion26](https://github.com/klion26) for their thoughtful reviews, detailed 
feedback, and support throughout the development of `arrow-avro`.
+
+If you have any questions about this blog post, please feel free to contact 
the author, [Connor Sanders](mailto:[email protected]).
\ No newline at end of file
diff --git a/img/introducing-arrow-avro/arrow-avro-architecture.svg 
b/img/introducing-arrow-avro/arrow-avro-architecture.svg
new file mode 100644
index 00000000000..f1f8feb1653
--- /dev/null
+++ b/img/introducing-arrow-avro/arrow-avro-architecture.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg"; 
xmlns:xlink="http://www.w3.org/1999/xlink"; xmlns:lucid="lucid" width="1462" 
height="742"><g transform="translate(521 361)" lucid:page-tab-id="0_0"><path 
d="M-220-354a6 6 0 0 1 6-6h848a6 6 0 0 1 6 6v728a6 6 0 0 1-6 6h-848a6 6 0 0 
1-6-6z" stroke="#000" stroke-width="2" fill-opacity="0"/><path d="M110-314a6 6 
0 0 1 6-6h188a6 6 0 0 1 6 6v208a6 6 0 0 1-6 6H116a6 6 0 0 1-6-6z" stroke="#000" 
stroke-width="2" fill="#fff"/><use xlink:href="#a" transform="ma [...]
\ No newline at end of file
diff --git a/img/introducing-arrow-avro/read_violin_10k.svg 
b/img/introducing-arrow-avro/read_violin_10k.svg
new file mode 100644
index 00000000000..6e63143ddf5
--- /dev/null
+++ b/img/introducing-arrow-avro/read_violin_10k.svg
@@ -0,0 +1,79 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg width="960" height="294" viewBox="0 0 960 294" 
xmlns="http://www.w3.org/2000/svg";>
+  <text x="480" y="5" dy="0.76em" text-anchor="middle" 
font-family="sans-serif" font-size="16.129032258064516" opacity="1" 
fill="#000000" style="white-space: pre;">
+R/10K: Violin plot
+</text>
+  <text x="528" y="281" dy="-0.5ex" text-anchor="middle" 
font-family="sans-serif" font-size="9.67741935483871" opacity="1" 
fill="#000000" style="white-space: pre;">
+Average time (ms)
+</text>
+  <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" 
points="108,39 108,232 "/>
+  <text style="font-size: 10.0645px; font-weight: 700; text-anchor: end; 
white-space: pre;" x="99" y="220" dy="0.5ex" transform="matrix(1, 0, 0, 1, 
1.781357, -6.893451)"><tspan x="99" dy="1em">​</tspan>apache-avro/np/10K<tspan 
x="99" dy="1em">​</tspan></text>
+  <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" 
points="103,220 108,220 "/>
+  <text style="font-size: 10.0645px; font-weight: 700; text-anchor: end; 
white-space: pre;" x="99" y="196" dy="0.5ex" transform="matrix(1, 0, 0, 1, 
1.565131, -6.823285)"><tspan x="99" dy="1em">​</tspan>arrow-avro/np/10K<tspan 
x="99" dy="1em">​</tspan></text>
+  <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" 
points="103,196 108,196 "/>
+  <text style="font-size: 10.0645px; font-weight: 700; text-anchor: end; 
white-space: pre;" x="99" y="172" dy="0.5ex" transform="matrix(1, 0, 0, 1, 
2.263927, -6.230454)"><tspan x="99" dy="1em">​</tspan>apache-avro/f1/10K<tspan 
x="99" dy="1em">​</tspan></text>
+  <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" 
points="103,172 108,172 "/>
+  <text style="font-size: 10.0645px; font-weight: 700; text-anchor: end; 
white-space: pre;" x="99" y="148" dy="0.5ex" transform="matrix(1, 0, 0, 1, 
0.532689, -6.343578)"><tspan x="99" dy="1em">​</tspan>arrow-avro/f1/10K<tspan 
x="99" dy="1em">​</tspan></text>
+  <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" 
points="103,148 108,148 "/>
+  <text style="font-size: 10.1px; font-weight: 700; text-anchor: end; 
white-space: pre;" x="103.644" y="124.462" dy="0.5ex" transform="matrix(1, 0, 
0, 1, -2.03527, -7.556549)"><tspan x="103.64399719238281" 
dy="1em">​</tspan>apache-avro/p8/10K<tspan x="103.64399719238281" 
dy="1em">​</tspan></text>
+  <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" 
points="103,124 108,124 "/>
+  <text style="font-size: 10.1px; font-weight: 700; text-anchor: end; 
white-space: pre;" x="103.859" y="99.717" dy="0.5ex" transform="matrix(1, 0, 0, 
1, -3.691591, -7.534968)"><tspan x="103.85900115966797" 
dy="1em">​</tspan>arrow-avro/p8/10K<tspan x="103.85900115966797" 
dy="1em">​</tspan></text>
+  <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" 
points="103,100 108,100 "/>
+  <text style="font-size: 10.1px; font-weight: 700; text-anchor: end; 
white-space: pre;" x="105.131" y="76" dy="0.5ex" transform="matrix(1, 0, 0, 1, 
-4.725465, -6.99512)"><tspan x="105.13099670410156" 
dy="1em">​</tspan>apache-avro/f8/10K<tspan x="105.13099670410156" 
dy="1em">​</tspan></text>
+  <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" 
points="103,76 108,76 "/>
+  <text style="font-size: 10.1px; font-weight: 700; text-anchor: end; 
white-space: pre;" x="102.216" y="52.331" dy="0.5ex" transform="matrix(1, 0, 0, 
1, -1.914529, -7.648093)"><tspan x="102.21600341796875" 
dy="1em">​</tspan>arrow-avro/f8/10K<tspan x="102.21600341796875" 
dy="1em">​</tspan></text>
+  <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" 
points="103,52 108,52 "/>
+  <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" 
points="109,233 946,233 "/>
+  <text x="109" y="243" dy="0.76em" text-anchor="middle" 
font-family="sans-serif" font-size="9.67741935483871" opacity="1" 
fill="#000000" style="white-space: pre;">
+0.0
+</text>
+  <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" 
points="109,233 109,238 "/>
+  <text x="207" y="243" dy="0.76em" text-anchor="middle" 
font-family="sans-serif" font-size="9.67741935483871" opacity="1" 
fill="#000000" style="white-space: pre;">
+1.0
+</text>
+  <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" 
points="207,233 207,238 "/>
+  <text x="306" y="243" dy="0.76em" text-anchor="middle" 
font-family="sans-serif" font-size="9.67741935483871" opacity="1" 
fill="#000000" style="white-space: pre;">
+2.0
+</text>
+  <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" 
points="306,233 306,238 "/>
+  <text x="405" y="243" dy="0.76em" text-anchor="middle" 
font-family="sans-serif" font-size="9.67741935483871" opacity="1" 
fill="#000000" style="white-space: pre;">
+3.0
+</text>
+  <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" 
points="405,233 405,238 "/>
+  <text x="504" y="243" dy="0.76em" text-anchor="middle" 
font-family="sans-serif" font-size="9.67741935483871" opacity="1" 
fill="#000000" style="white-space: pre;">
+4.0
+</text>
+  <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" 
points="504,233 504,238 "/>
+  <text x="603" y="243" dy="0.76em" text-anchor="middle" 
font-family="sans-serif" font-size="9.67741935483871" opacity="1" 
fill="#000000" style="white-space: pre;">
+5.0
+</text>
+  <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" 
points="603,233 603,238 "/>
+  <text x="702" y="243" dy="0.76em" text-anchor="middle" 
font-family="sans-serif" font-size="9.67741935483871" opacity="1" 
fill="#000000" style="white-space: pre;">
+6.0
+</text>
+  <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" 
points="702,233 702,238 "/>
+  <text x="801" y="243" dy="0.76em" text-anchor="middle" 
font-family="sans-serif" font-size="9.67741935483871" opacity="1" 
fill="#000000" style="white-space: pre;">
+7.0
+</text>
+  <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" 
points="801,233 801,238 "/>
+  <text x="900" y="243" dy="0.76em" text-anchor="middle" 
font-family="sans-serif" font-size="9.67741935483871" opacity="1" 
fill="#000000" style="white-space: pre;">
+8.0
+</text>
+  <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" 
points="900,233 900,238 "/>
+  <polygon opacity="1" fill="#1F78B4" points="358,220 358,220 358,220 358,220 
358,220 358,220 358,220 359,220 359,220 359,220 359,220 359,220 359,220 359,220 
359,220 359,220 359,220 359,220 359,220 359,220 359,220 359,220 359,220 359,220 
359,220 359,220 360,220 360,220 360,220 360,220 360,220 360,220 360,220 360,220 
360,220 360,220 360,220 360,220 360,220 360,220 360,220 360,220 360,220 360,220 
360,220 361,220 361,220 361,220 361,220 361,220 361,220 361,220 361,220 361,220 
361,220 361,22 [...]
+  <polygon opacity="1" fill="#1F78B4" points="358,220 358,220 358,220 358,220 
358,220 358,220 358,220 359,220 359,220 359,220 359,220 359,220 359,220 359,220 
359,220 359,220 359,220 359,220 359,220 359,220 359,220 359,220 359,220 359,220 
359,220 359,221 360,221 360,221 360,221 360,221 360,221 360,221 360,221 360,221 
360,221 360,221 360,221 360,221 360,221 360,221 360,221 360,221 360,221 360,221 
360,221 361,221 361,221 361,221 361,221 361,221 361,221 361,221 361,221 361,221 
361,221 361,22 [...]
+  <polygon opacity="1" fill="#1F78B4" points="132,196 132,196 132,196 132,196 
132,196 132,196 132,196 132,196 132,196 132,196 132,196 132,196 132,196 132,196 
132,196 132,196 132,196 132,196 132,196 132,196 132,196 132,196 132,196 132,196 
132,196 132,196 132,196 132,196 132,196 132,196 132,196 132,196 132,196 132,196 
132,196 132,196 132,196 132,196 132,196 132,196 132,196 132,196 132,196 132,196 
132,196 132,196 132,196 132,196 132,196 132,196 132,196 132,196 132,196 132,196 
132,196 132,19 [...]
+  <polygon opacity="1" fill="#1F78B4" points="132,196 132,196 132,196 132,196 
132,196 132,196 132,196 132,196 132,196 132,196 132,196 132,196 132,196 132,196 
132,196 132,196 132,196 132,196 132,196 132,196 132,196 132,196 132,196 132,196 
132,196 132,196 132,196 132,196 132,196 132,196 132,196 132,196 132,196 132,196 
132,197 132,197 132,197 132,197 132,197 132,197 132,197 132,197 132,197 132,197 
132,197 132,197 132,197 132,197 132,197 132,197 132,197 132,197 132,197 132,197 
132,197 132,19 [...]
+  <polygon opacity="1" fill="#1F78B4" points="359,172 359,172 359,172 359,172 
359,172 359,172 359,172 359,172 360,172 360,172 360,172 360,172 360,172 360,172 
360,172 360,172 360,172 360,172 360,172 360,172 360,172 360,172 360,172 360,172 
361,172 361,172 361,172 361,172 361,172 361,172 361,172 361,172 361,172 361,172 
361,172 361,172 361,172 361,172 361,172 361,172 362,172 362,172 362,172 362,171 
362,171 362,171 362,171 362,171 362,171 362,171 362,171 362,171 362,171 362,171 
362,171 362,17 [...]
+  <polygon opacity="1" fill="#1F78B4" points="359,172 359,172 359,172 359,172 
359,172 359,172 359,172 359,172 360,172 360,172 360,172 360,172 360,172 360,172 
360,172 360,172 360,172 360,172 360,172 360,172 360,172 360,172 360,172 360,172 
361,172 361,172 361,172 361,172 361,172 361,172 361,172 361,172 361,173 361,173 
361,173 361,173 361,173 361,173 361,173 361,173 362,173 362,173 362,173 362,173 
362,173 362,173 362,173 362,173 362,173 362,173 362,173 362,173 362,173 362,173 
362,174 362,17 [...]
+  <polygon opacity="1" fill="#1F78B4" points="132,148 132,148 132,148 132,148 
132,148 132,148 132,148 132,148 132,148 132,148 132,148 132,148 132,148 132,148 
132,148 132,148 132,148 132,148 132,148 132,148 132,148 132,148 132,148 132,148 
132,148 132,148 132,148 132,148 132,148 132,148 132,148 132,148 132,148 132,148 
132,148 132,148 132,148 132,148 132,148 132,148 132,148 132,148 132,148 132,148 
132,148 132,148 132,148 132,148 132,148 132,148 132,148 132,148 132,148 132,147 
132,147 132,14 [...]
+  <polygon opacity="1" fill="#1F78B4" points="132,148 132,148 132,148 132,148 
132,148 132,148 132,148 132,148 132,148 132,148 132,148 132,148 132,148 132,148 
132,148 132,148 132,148 132,148 132,148 132,148 132,148 132,148 132,148 132,148 
132,148 132,148 132,148 132,148 132,148 132,148 132,148 132,148 132,148 132,148 
132,148 132,148 132,148 132,148 132,148 132,148 132,148 132,148 132,148 132,148 
132,148 132,148 132,148 132,148 132,149 132,149 132,149 132,149 132,149 132,149 
132,149 132,14 [...]
+  <polygon opacity="1" fill="#1F78B4" points="853,124 853,124 853,124 854,124 
854,124 854,124 854,124 854,124 854,124 855,124 855,124 855,124 855,124 855,124 
856,124 856,124 856,124 856,124 856,124 856,124 857,124 857,124 857,124 857,124 
857,124 858,124 858,124 858,124 858,124 858,124 859,124 859,124 859,124 859,124 
859,124 859,124 860,124 860,124 860,124 860,124 860,124 861,124 861,124 861,123 
861,123 861,123 861,123 862,123 862,123 862,123 862,123 862,123 863,123 863,123 
863,123 863,12 [...]
+  <polygon opacity="1" fill="#1F78B4" points="853,124 853,124 853,124 854,124 
854,124 854,124 854,124 854,124 854,124 855,124 855,124 855,124 855,124 855,124 
856,124 856,124 856,124 856,124 856,124 856,124 857,124 857,124 857,124 857,124 
857,124 858,124 858,124 858,124 858,124 858,124 859,124 859,124 859,124 859,124 
859,124 859,124 860,124 860,124 860,124 860,124 860,124 861,124 861,124 861,124 
861,124 861,124 861,124 862,124 862,125 862,125 862,125 862,125 863,125 863,125 
863,125 863,12 [...]
+  <polygon opacity="1" fill="#1F78B4" points="131,100 131,100 131,100 131,100 
131,100 131,100 131,100 131,100 131,100 131,100 131,100 131,100 131,100 131,100 
131,100 131,100 131,100 131,100 131,100 131,100 131,100 131,100 131,100 131,100 
131,100 131,100 131,100 131,100 131,100 131,100 131,100 131,100 131,100 131,100 
131,100 131,100 131,100 131,100 131,100 131,100 131,100 131,99 131,99 131,99 
131,99 131,99 131,99 131,99 131,99 131,99 131,99 131,99 131,99 131,99 131,99 
131,99 131,99 131,99 [...]
+  <polygon opacity="1" fill="#1F78B4" points="131,100 131,100 131,100 131,100 
131,100 131,100 131,100 131,100 131,100 131,100 131,100 131,100 131,100 131,100 
131,100 131,100 131,100 131,100 131,100 131,100 131,100 131,100 131,100 131,100 
131,100 131,100 131,100 131,100 131,100 131,100 131,100 131,100 131,100 131,100 
131,100 131,100 131,100 131,100 131,100 131,100 131,100 131,100 131,100 131,100 
131,100 131,100 131,100 131,100 131,100 131,100 131,100 131,100 131,100 131,100 
131,100 131,10 [...]
+  <polygon opacity="1" fill="#1F78B4" points="355,76 355,76 355,76 355,76 
355,76 355,76 355,76 355,76 355,76 355,76 355,76 355,76 355,76 355,76 356,76 
356,76 356,76 356,76 356,76 356,76 356,76 356,76 356,76 356,76 356,76 356,76 
356,76 356,76 356,76 356,76 356,76 356,76 356,76 356,76 356,76 357,76 357,76 
357,76 357,75 357,75 357,75 357,75 357,75 357,75 357,75 357,75 357,75 357,75 
357,75 357,75 357,75 357,75 357,75 357,75 357,75 357,75 358,75 358,75 358,75 
358,75 358,75 358,75 358,75 358,7 [...]
+  <polygon opacity="1" fill="#1F78B4" points="355,76 355,76 355,76 355,76 
355,76 355,76 355,76 355,76 355,76 355,76 355,76 355,76 355,76 355,76 356,76 
356,76 356,76 356,76 356,76 356,76 356,76 356,76 356,76 356,76 356,76 356,76 
356,76 356,76 356,76 356,76 356,76 356,76 356,76 356,76 356,76 357,76 357,76 
357,76 357,76 357,76 357,76 357,76 357,76 357,76 357,76 357,76 357,76 357,76 
357,76 357,76 357,76 357,76 357,76 357,76 357,76 357,76 358,76 358,76 358,76 
358,76 358,76 358,76 358,76 358,7 [...]
+  <polygon opacity="1" fill="#1F78B4" points="131,52 131,52 131,52 131,52 
131,52 131,52 131,52 131,52 131,52 131,52 131,51 131,51 131,51 131,51 131,51 
131,51 131,51 131,51 131,51 131,51 131,51 131,51 131,51 131,51 131,51 131,51 
131,51 131,51 131,51 131,51 131,51 131,51 131,51 131,51 131,51 131,51 131,51 
131,51 131,51 131,51 131,51 131,51 131,51 131,51 131,51 131,51 131,51 131,51 
131,51 131,51 131,51 131,51 131,51 131,51 131,51 131,51 131,51 131,50 131,50 
131,50 131,50 131,50 131,50 131,5 [...]
+  <polygon opacity="1" fill="#1F78B4" points="131,52 131,52 131,52 131,52 
131,52 131,52 131,52 131,52 131,52 131,52 131,52 131,52 131,52 131,52 131,52 
131,52 131,52 131,52 131,52 131,52 131,52 131,52 131,52 131,52 131,52 131,52 
131,52 131,52 131,52 131,52 131,52 131,52 131,52 131,52 131,52 131,52 131,52 
131,52 131,52 131,52 131,52 131,52 131,52 131,52 131,52 131,52 131,52 131,52 
131,52 131,52 131,52 131,52 131,52 131,52 131,52 131,53 131,53 131,53 131,53 
131,53 131,53 131,53 131,53 131,5 [...]
+</svg>
\ No newline at end of file
diff --git a/img/introducing-arrow-avro/read_violin_1m.svg 
b/img/introducing-arrow-avro/read_violin_1m.svg
new file mode 100644
index 00000000000..e536377239a
--- /dev/null
+++ b/img/introducing-arrow-avro/read_violin_1m.svg
@@ -0,0 +1,79 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg width="960" height="294" viewBox="0 0 960 294" 
xmlns="http://www.w3.org/2000/svg";>
+  <text x="480" y="5" dy="0.76em" text-anchor="middle" 
font-family="sans-serif" font-size="16.129032258064516" opacity="1" 
fill="#000000" style="white-space: pre;">
+R/1M: Violin plot
+</text>
+  <text x="528" y="281" dy="-0.5ex" text-anchor="middle" 
font-family="sans-serif" font-size="9.67741935483871" opacity="1" 
fill="#000000" style="white-space: pre;">
+Average time (ms)
+</text>
+  <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" 
points="108,39 108,232 "/>
+  <text style="font-size: 10.1px; font-weight: 700; text-anchor: end; 
white-space: pre;" x="104.868" y="220.23" dy="0.5ex" transform="matrix(1, 0, 0, 
1, -5.214254, -7.526795)"><tspan x="104.86799621582031" 
dy="1em">​</tspan>apache-avro/np/1M<tspan x="104.86799621582031" 
dy="1em">​</tspan></text>
+  <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" 
points="103,220 108,220 "/>
+  <text style="font-size: 10.1px; font-weight: 700; text-anchor: end; 
white-space: pre;" x="103.068" y="196.209" dy="0.5ex" transform="matrix(1, 0, 
0, 1, -3.655307, -7.130969)"><tspan x="103.06800079345703" 
dy="1em">​</tspan>arrow-avro/np/1M<tspan x="103.06800079345703" 
dy="1em">​</tspan></text>
+  <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" 
points="103,196 108,196 "/>
+  <text style="font-size: 10.1px; font-weight: 700; text-anchor: end; 
white-space: pre;" x="102.661" y="172.183" dy="0.5ex" transform="matrix(1, 0, 
0, 1, -2.367347, -6.89804)"><tspan x="102.66100311279297" 
dy="1em">​</tspan>apache-avro/f1/1M<tspan x="102.66100311279297" 
dy="1em">​</tspan></text>
+  <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" 
points="103,172 108,172 "/>
+  <text style="font-size: 10.1px; font-weight: 700; text-anchor: end; 
white-space: pre;" x="103.534" y="148.106" dy="0.5ex" transform="matrix(1, 0, 
0, 1, -4.069402, -6.547885)"><tspan x="103.53399658203125" 
dy="1em">​</tspan>arrow-avro/f1/1M<tspan x="103.53399658203125" 
dy="1em">​</tspan></text>
+  <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" 
points="103,148 108,148 "/>
+  <text style="font-size: 10.1px; font-weight: 700; text-anchor: end; 
white-space: pre;" x="104.286" y="124.244" dy="0.5ex" transform="matrix(1, 0, 
0, 1, -4.305376, -7.264941)"><tspan x="104.28600311279297" 
dy="1em">​</tspan>apache-avro/p8/1M<tspan x="104.28600311279297" 
dy="1em">​</tspan></text>
+  <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" 
points="103,124 108,124 "/>
+  <text style="font-size: 10.1px; font-weight: 700; text-anchor: end; 
white-space: pre;" x="102.929" y="99.633" dy="0.5ex" transform="matrix(1, 0, 0, 
1, -3.624858, -6.596602)"><tspan x="102.92900085449219" 
dy="1em">​</tspan>arrow-avro/p8/1M<tspan x="102.92900085449219" 
dy="1em">​</tspan></text>
+  <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" 
points="103,100 108,100 "/>
+  <text style="font-size: 10.1px; font-weight: 700; text-anchor: end; 
white-space: pre;" x="102.402" y="76.161" dy="0.5ex" transform="matrix(1, 0, 0, 
1, -3.836473, -7.281687)"><tspan x="102.4020004272461" 
dy="1em">​</tspan>apache-avro/f8/1M<tspan x="102.4020004272461" 
dy="1em">​</tspan></text>
+  <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" 
points="103,76 108,76 "/>
+  <text style="font-size: 10.1px; font-weight: 700; text-anchor: end; 
white-space: pre;" x="102.521" y="52.218" dy="0.5ex" transform="matrix(1, 0, 0, 
1, -3.620291, -7.214701)"><tspan x="102.52100372314453" 
dy="1em">​</tspan>arrow-avro/f8/1M<tspan x="102.52100372314453" 
dy="1em">​</tspan></text>
+  <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" 
points="103,52 108,52 "/>
+  <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" 
points="109,233 946,233 "/>
+  <text x="109" y="243" dy="0.76em" text-anchor="middle" 
font-family="sans-serif" font-size="9.67741935483871" opacity="1" 
fill="#000000" style="white-space: pre;">
+0.0
+</text>
+  <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" 
points="109,233 109,238 "/>
+  <text x="209" y="243" dy="0.76em" text-anchor="middle" 
font-family="sans-serif" font-size="9.67741935483871" opacity="1" 
fill="#000000" style="white-space: pre;">
+100.0
+</text>
+  <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" 
points="209,233 209,238 "/>
+  <text x="309" y="243" dy="0.76em" text-anchor="middle" 
font-family="sans-serif" font-size="9.67741935483871" opacity="1" 
fill="#000000" style="white-space: pre;">
+200.0
+</text>
+  <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" 
points="309,233 309,238 "/>
+  <text x="410" y="243" dy="0.76em" text-anchor="middle" 
font-family="sans-serif" font-size="9.67741935483871" opacity="1" 
fill="#000000" style="white-space: pre;">
+300.0
+</text>
+  <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" 
points="410,233 410,238 "/>
+  <text x="510" y="243" dy="0.76em" text-anchor="middle" 
font-family="sans-serif" font-size="9.67741935483871" opacity="1" 
fill="#000000" style="white-space: pre;">
+400.0
+</text>
+  <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" 
points="510,233 510,238 "/>
+  <text x="611" y="243" dy="0.76em" text-anchor="middle" 
font-family="sans-serif" font-size="9.67741935483871" opacity="1" 
fill="#000000" style="white-space: pre;">
+500.0
+</text>
+  <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" 
points="611,233 611,238 "/>
+  <text x="711" y="243" dy="0.76em" text-anchor="middle" 
font-family="sans-serif" font-size="9.67741935483871" opacity="1" 
fill="#000000" style="white-space: pre;">
+600.0
+</text>
+  <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" 
points="711,233 711,238 "/>
+  <text x="812" y="243" dy="0.76em" text-anchor="middle" 
font-family="sans-serif" font-size="9.67741935483871" opacity="1" 
fill="#000000" style="white-space: pre;">
+700.0
+</text>
+  <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" 
points="812,233 812,238 "/>
+  <text x="912" y="243" dy="0.76em" text-anchor="middle" 
font-family="sans-serif" font-size="9.67741935483871" opacity="1" 
fill="#000000" style="white-space: pre;">
+800.0
+</text>
+  <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" 
points="912,233 912,238 "/>
+  <polygon opacity="1" fill="#1F78B4" points="371,220 372,220 372,220 372,220 
372,220 372,220 372,220 372,220 372,220 372,220 372,220 372,220 372,220 372,220 
372,220 372,220 372,220 372,220 372,220 372,220 372,220 372,220 372,220 372,220 
372,220 372,220 372,220 372,220 372,220 372,220 372,220 372,220 372,220 372,220 
372,220 372,220 372,220 372,220 373,220 373,220 373,220 373,220 373,220 373,220 
373,220 373,220 373,220 373,220 373,220 373,220 373,220 373,220 373,220 373,220 
373,220 373,22 [...]
+  <polygon opacity="1" fill="#1F78B4" points="371,220 372,220 372,220 372,220 
372,220 372,220 372,220 372,220 372,220 372,220 372,220 372,220 372,220 372,220 
372,220 372,220 372,220 372,220 372,221 372,221 372,221 372,221 372,221 372,221 
372,221 372,221 372,221 372,221 372,221 372,221 372,221 372,221 372,221 372,221 
372,221 372,221 372,221 372,221 373,221 373,221 373,221 373,221 373,221 373,221 
373,221 373,221 373,221 373,221 373,221 373,221 373,221 373,221 373,221 373,221 
373,221 373,22 [...]
+  <polygon opacity="1" fill="#1F78B4" points="136,196 136,196 136,196 136,196 
136,196 136,196 136,196 136,196 136,196 136,196 136,196 136,196 136,196 136,196 
136,196 136,196 136,196 136,196 136,196 136,196 136,196 136,196 136,196 136,196 
136,196 136,196 136,196 136,196 136,196 136,196 136,196 136,196 136,196 136,196 
136,196 136,196 136,196 136,196 136,196 136,196 136,196 136,196 136,196 136,196 
136,196 136,196 136,196 136,196 136,196 136,196 136,196 136,195 136,195 136,195 
136,195 136,19 [...]
+  <polygon opacity="1" fill="#1F78B4" points="136,196 136,196 136,196 136,196 
136,196 136,196 136,196 136,196 136,196 136,196 136,196 136,196 136,196 136,196 
136,196 136,196 136,196 136,196 136,196 136,196 136,196 136,196 136,196 136,196 
136,197 136,197 136,197 136,197 136,197 136,197 136,197 136,197 136,197 136,197 
136,197 136,197 136,197 136,197 136,197 136,197 136,197 136,197 136,197 136,197 
136,197 136,197 136,197 136,197 136,197 136,197 136,197 136,197 136,197 136,197 
136,197 136,19 [...]
+  <polygon opacity="1" fill="#1F78B4" points="366,172 366,172 366,172 366,172 
366,172 366,172 366,172 366,172 366,172 366,172 366,172 366,172 366,172 366,172 
366,172 366,172 366,172 366,172 366,172 366,172 366,172 366,172 367,172 367,172 
367,172 367,172 367,172 367,172 367,172 367,172 367,172 367,172 367,172 367,172 
367,172 367,172 367,172 367,172 367,172 367,172 367,172 367,172 367,172 367,172 
367,172 367,172 367,172 367,172 367,172 367,172 367,172 367,172 368,172 368,172 
368,171 368,17 [...]
+  <polygon opacity="1" fill="#1F78B4" points="366,172 366,172 366,172 366,172 
366,172 366,172 366,172 366,172 366,172 366,172 366,172 366,172 366,172 366,172 
366,172 366,172 366,172 366,172 366,172 366,172 366,172 366,172 367,172 367,172 
367,172 367,172 367,172 367,172 367,172 367,172 367,172 367,172 367,172 367,172 
367,172 367,172 367,172 367,172 367,172 367,172 367,173 367,173 367,173 367,173 
367,173 367,173 367,173 367,173 367,173 367,173 367,173 367,173 368,173 368,173 
368,173 368,17 [...]
+  <polygon opacity="1" fill="#1F78B4" points="136,148 136,148 136,148 136,148 
136,148 136,148 136,148 136,148 136,148 136,148 136,148 136,148 136,148 136,148 
136,148 136,148 136,148 136,148 136,148 136,148 136,148 136,148 136,148 136,148 
136,148 136,148 136,148 136,148 136,148 136,148 136,148 136,148 136,148 136,148 
136,148 136,148 136,148 136,148 136,148 136,148 136,148 136,148 136,148 136,147 
136,147 136,147 136,147 136,147 136,147 136,147 136,147 136,147 136,147 136,147 
136,147 136,14 [...]
+  <polygon opacity="1" fill="#1F78B4" points="136,148 136,148 136,148 136,148 
136,148 136,148 136,148 136,148 136,148 136,148 136,148 136,148 136,148 136,148 
136,148 136,148 136,148 136,148 136,148 136,148 136,148 136,148 136,148 136,148 
136,148 136,148 136,148 136,148 136,148 136,148 136,148 136,148 136,148 136,148 
136,148 136,148 136,148 136,148 136,148 136,149 136,149 136,149 136,149 136,149 
136,149 136,149 136,149 136,149 136,149 136,149 136,149 136,149 136,149 136,149 
136,149 136,14 [...]
+  <polygon opacity="1" fill="#1F78B4" points="882,124 882,124 882,124 882,124 
882,124 882,124 883,124 883,124 883,124 883,124 883,124 883,124 883,124 883,124 
884,124 884,124 884,124 884,124 884,124 884,124 884,124 884,124 885,124 885,124 
885,124 885,124 885,124 885,124 885,124 885,124 886,124 886,124 886,124 886,124 
886,124 886,124 886,124 886,124 887,124 887,124 887,124 887,124 887,124 887,124 
887,124 887,124 888,124 888,124 888,124 888,124 888,124 888,123 888,123 889,123 
889,123 889,12 [...]
+  <polygon opacity="1" fill="#1F78B4" points="882,124 882,124 882,124 882,124 
882,124 882,124 883,124 883,124 883,124 883,124 883,124 883,124 883,124 883,124 
884,124 884,124 884,124 884,124 884,124 884,124 884,124 884,124 885,124 885,124 
885,124 885,124 885,124 885,124 885,124 885,124 886,124 886,124 886,124 886,124 
886,124 886,124 886,124 886,124 887,124 887,124 887,124 887,124 887,124 887,124 
887,124 887,124 888,124 888,124 888,124 888,124 888,124 888,124 888,124 889,124 
889,124 889,12 [...]
+  <polygon opacity="1" fill="#1F78B4" points="134,100 134,100 134,100 134,100 
134,100 134,100 134,100 134,100 134,100 134,100 134,100 134,100 134,100 134,100 
134,100 134,100 134,100 134,100 134,100 134,100 134,100 134,100 134,100 134,100 
134,100 134,100 134,100 134,100 134,100 134,100 134,99 134,99 134,99 134,99 
134,99 134,99 134,99 134,99 134,99 134,99 134,99 134,99 134,99 134,99 134,99 
134,99 134,99 134,99 134,99 134,99 134,99 134,99 134,99 134,99 134,99 134,99 
134,99 134,99 134,98 134 [...]
+  <polygon opacity="1" fill="#1F78B4" points="134,100 134,100 134,100 134,100 
134,100 134,100 134,100 134,100 134,100 134,100 134,100 134,100 134,100 134,100 
134,100 134,100 134,100 134,100 134,100 134,100 134,100 134,100 134,100 134,100 
134,100 134,100 134,100 134,100 134,100 134,100 134,100 134,100 134,100 134,100 
134,100 134,100 134,100 134,100 134,100 134,100 134,100 134,100 134,100 134,100 
134,100 134,101 134,101 134,101 134,101 134,101 134,101 134,101 134,101 134,101 
134,101 134,10 [...]
+  <polygon opacity="1" fill="#1F78B4" points="373,76 373,76 373,76 373,76 
373,76 373,76 373,76 373,76 373,76 373,76 373,76 373,76 373,76 373,76 373,76 
373,76 374,76 374,76 374,76 374,76 374,76 374,76 374,76 374,76 374,76 374,76 
374,76 374,76 374,76 374,76 374,76 374,76 374,76 374,76 374,76 374,76 374,76 
374,76 374,76 374,76 374,75 374,75 374,75 374,75 374,75 374,75 374,75 374,75 
374,75 374,75 374,75 374,75 374,75 374,75 374,75 374,75 374,75 374,75 374,75 
374,75 374,75 374,75 374,75 374,7 [...]
+  <polygon opacity="1" fill="#1F78B4" points="373,76 373,76 373,76 373,76 
373,76 373,76 373,76 373,76 373,76 373,76 373,76 373,76 373,76 373,76 373,76 
373,76 374,76 374,76 374,76 374,76 374,76 374,76 374,76 374,76 374,76 374,76 
374,76 374,76 374,76 374,76 374,76 374,76 374,76 374,76 374,76 374,76 374,76 
374,76 374,76 374,76 374,76 374,76 374,76 374,76 374,76 374,76 374,76 374,76 
374,76 374,76 374,76 374,76 374,76 374,76 374,76 374,76 374,76 374,76 374,76 
374,76 374,76 374,76 374,76 374,7 [...]
+  <polygon opacity="1" fill="#1F78B4" points="136,52 136,52 136,52 136,52 
136,52 136,52 136,52 136,52 136,52 136,52 136,52 136,51 136,51 136,51 136,51 
136,51 136,51 136,51 136,51 136,51 136,51 136,51 136,51 136,51 136,51 136,51 
136,51 136,51 136,51 136,51 136,51 136,51 136,51 136,51 136,51 136,51 136,51 
136,51 136,51 136,51 136,51 136,51 136,51 136,51 136,51 136,51 136,51 136,51 
136,51 136,51 136,51 136,51 136,51 136,51 136,51 136,51 136,51 136,51 136,51 
136,51 136,51 136,50 136,50 136,5 [...]
+  <polygon opacity="1" fill="#1F78B4" points="136,52 136,52 136,52 136,52 
136,52 136,52 136,52 136,52 136,52 136,52 136,52 136,52 136,52 136,52 136,52 
136,52 136,52 136,52 136,52 136,52 136,52 136,52 136,52 136,52 136,52 136,52 
136,52 136,52 136,52 136,52 136,52 136,52 136,52 136,52 136,52 136,52 136,52 
136,52 136,52 136,52 136,52 136,52 136,52 136,52 136,52 136,52 136,52 136,52 
136,52 136,52 136,52 136,52 136,52 136,52 136,52 136,52 136,52 136,52 136,53 
136,53 136,53 136,53 136,53 136,5 [...]
+</svg>
\ No newline at end of file
diff --git a/img/introducing-arrow-avro/write_violin_10k.svg 
b/img/introducing-arrow-avro/write_violin_10k.svg
new file mode 100644
index 00000000000..ac8acd06cf9
--- /dev/null
+++ b/img/introducing-arrow-avro/write_violin_10k.svg
@@ -0,0 +1,65 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg width="960" height="222" viewBox="0 0 960 222" 
xmlns="http://www.w3.org/2000/svg";>
+  <text x="480" y="5" dy="0.76em" text-anchor="middle" 
font-family="sans-serif" font-size="16.129032258064516" opacity="1" 
fill="#000000" style="white-space: pre;" transform="matrix(1, 0, 0, 1, 0, 
-1.163632)"><tspan x="480" dy="1em">​</tspan>W/10K: Violin plot<tspan x="480" 
dy="1em">​</tspan></text>
+  <text x="528" y="212" dy="-0.5ex" text-anchor="middle" 
font-family="sans-serif" font-size="9.67741935483871" opacity="1" 
fill="#000000" style="white-space: pre;">
+Average time (ms)
+</text>
+  <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" 
points="105,36 105,163 "/>
+  <text style="font-size: 10.0645px; font-weight: 700; text-anchor: end; 
white-space: pre;" x="96" y="148" dy="0.5ex" transform="matrix(1, 0, 0, 1, 
1.149304, -7.594823)"><tspan x="96" dy="1em">​</tspan>apache-avro/h/10K<tspan 
x="96" dy="1em">​</tspan></text>
+  <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" 
points="100,148 105,148 "/>
+  <text style="font-size: 10.0645px; font-weight: 700; text-anchor: end; 
white-space: pre;" x="96" y="116" dy="0.5ex" transform="matrix(1, 0, 0, 1, 
0.75781, -7.240954)"><tspan x="96" dy="1em">​</tspan>arrow-avro/h/10K<tspan 
x="96" dy="1em">​</tspan></text>
+  <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" 
points="100,116 105,116 "/>
+  <text style="font-size: 10.0645px; font-weight: 700; text-anchor: end; 
white-space: pre;" x="96" y="84" dy="0.5ex" transform="matrix(1, 0, 0, 1, 
1.209105, -7.29784)"><tspan x="96" dy="1em">​</tspan>apache-avro/c/10K<tspan 
x="96" dy="1em">​</tspan></text>
+  <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" 
points="100,84 105,84 "/>
+  <text style="font-size: 10.0645px; font-weight: 700; text-anchor: end; 
white-space: pre;" x="96" y="52" dy="0.5ex" transform="matrix(1, 0, 0, 1, 
0.932029, -7.066851)"><tspan x="96" dy="1em">​</tspan>arrow-avro/c/10K<tspan 
x="96" dy="1em">​</tspan></text>
+  <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" 
points="100,52 105,52 "/>
+  <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" 
points="106,164 949,164 "/>
+  <text x="106" y="174" dy="0.76em" text-anchor="middle" 
font-family="sans-serif" font-size="9.67741935483871" opacity="1" 
fill="#000000" style="white-space: pre;">
+0.0
+</text>
+  <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" 
points="106,164 106,169 "/>
+  <text x="192" y="174" dy="0.76em" text-anchor="middle" 
font-family="sans-serif" font-size="9.67741935483871" opacity="1" 
fill="#000000" style="white-space: pre;">
+0.5
+</text>
+  <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" 
points="192,164 192,169 "/>
+  <text x="279" y="174" dy="0.76em" text-anchor="middle" 
font-family="sans-serif" font-size="9.67741935483871" opacity="1" 
fill="#000000" style="white-space: pre;">
+1.0
+</text>
+  <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" 
points="279,164 279,169 "/>
+  <text x="366" y="174" dy="0.76em" text-anchor="middle" 
font-family="sans-serif" font-size="9.67741935483871" opacity="1" 
fill="#000000" style="white-space: pre;">
+1.5
+</text>
+  <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" 
points="366,164 366,169 "/>
+  <text x="453" y="174" dy="0.76em" text-anchor="middle" 
font-family="sans-serif" font-size="9.67741935483871" opacity="1" 
fill="#000000" style="white-space: pre;">
+2.0
+</text>
+  <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" 
points="453,164 453,169 "/>
+  <text x="539" y="174" dy="0.76em" text-anchor="middle" 
font-family="sans-serif" font-size="9.67741935483871" opacity="1" 
fill="#000000" style="white-space: pre;">
+2.5
+</text>
+  <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" 
points="539,164 539,169 "/>
+  <text x="626" y="174" dy="0.76em" text-anchor="middle" 
font-family="sans-serif" font-size="9.67741935483871" opacity="1" 
fill="#000000" style="white-space: pre;">
+3.0
+</text>
+  <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" 
points="626,164 626,169 "/>
+  <text x="713" y="174" dy="0.76em" text-anchor="middle" 
font-family="sans-serif" font-size="9.67741935483871" opacity="1" 
fill="#000000" style="white-space: pre;">
+3.5
+</text>
+  <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" 
points="713,164 713,169 "/>
+  <text x="800" y="174" dy="0.76em" text-anchor="middle" 
font-family="sans-serif" font-size="9.67741935483871" opacity="1" 
fill="#000000" style="white-space: pre;">
+4.0
+</text>
+  <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" 
points="800,164 800,169 "/>
+  <text x="886" y="174" dy="0.76em" text-anchor="middle" 
font-family="sans-serif" font-size="9.67741935483871" opacity="1" 
fill="#000000" style="white-space: pre;">
+4.5
+</text>
+  <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" 
points="886,164 886,169 "/>
+  <polygon opacity="1" fill="#1F78B4" points="241,148 241,148 241,148 241,148 
241,148 241,148 241,148 241,148 241,148 241,148 241,148 241,148 241,148 241,148 
241,148 241,148 241,148 242,148 242,148 242,148 242,148 242,148 242,148 242,148 
242,148 242,148 242,148 242,148 242,148 242,148 242,147 242,147 242,147 242,147 
242,147 242,147 242,147 242,147 242,147 242,147 242,147 242,147 242,147 242,147 
242,147 242,147 242,147 242,147 242,147 242,147 242,147 242,147 242,147 242,147 
242,147 242,14 [...]
+  <polygon opacity="1" fill="#1F78B4" points="241,148 241,148 241,148 241,148 
241,148 241,148 241,148 241,148 241,148 241,148 241,148 241,148 241,148 241,148 
241,148 241,148 241,148 242,148 242,148 242,148 242,148 242,148 242,148 242,148 
242,148 242,148 242,148 242,148 242,148 242,148 242,148 242,148 242,148 242,148 
242,148 242,148 242,148 242,148 242,148 242,148 242,148 242,148 242,148 242,148 
242,148 242,148 242,148 242,148 242,148 242,148 242,148 242,148 242,148 242,148 
242,148 242,14 [...]
+  <polygon opacity="1" fill="#1F78B4" points="150,116 150,116 150,116 150,116 
150,116 150,116 150,116 150,116 150,116 150,116 150,116 150,116 151,116 151,116 
151,116 151,116 151,116 151,116 151,116 151,116 151,116 151,116 151,116 151,116 
151,116 151,116 151,116 151,116 151,116 151,116 151,116 151,116 151,116 151,116 
151,116 151,116 151,116 151,116 151,116 151,116 151,116 151,116 151,116 151,116 
151,116 151,116 151,116 151,116 151,116 151,116 151,116 151,115 151,115 151,115 
151,115 151,11 [...]
+  <polygon opacity="1" fill="#1F78B4" points="150,116 150,116 150,116 150,116 
150,116 150,116 150,116 150,116 150,116 150,116 150,116 150,116 151,116 151,116 
151,116 151,116 151,116 151,116 151,116 151,116 151,116 151,116 151,116 151,116 
151,116 151,116 151,116 151,116 151,116 151,116 151,116 151,116 151,116 151,116 
151,116 151,116 151,116 151,116 151,116 151,116 151,116 151,116 151,116 151,116 
151,116 151,116 151,116 151,116 151,116 151,116 151,116 151,116 151,116 151,116 
151,116 151,11 [...]
+  <polygon opacity="1" fill="#1F78B4" points="920,84 920,84 920,84 920,84 
920,84 920,84 921,84 921,84 921,84 921,84 921,84 921,84 921,84 921,84 921,84 
921,84 921,84 921,84 921,84 921,84 921,84 921,84 921,84 921,84 922,84 922,84 
922,84 922,84 922,84 922,84 922,84 922,84 922,84 922,84 922,84 922,84 922,84 
922,84 922,84 922,84 922,84 922,84 923,84 923,84 923,84 923,84 923,83 923,83 
923,83 923,83 923,83 923,83 923,83 923,83 923,83 923,83 923,83 923,83 923,83 
924,83 924,83 924,83 924,83 924,8 [...]
+  <polygon opacity="1" fill="#1F78B4" points="920,84 920,84 920,84 920,84 
920,84 920,84 921,84 921,84 921,84 921,84 921,84 921,84 921,84 921,84 921,84 
921,84 921,84 921,84 921,84 921,84 921,84 921,84 921,84 921,84 922,84 922,84 
922,84 922,84 922,84 922,84 922,84 922,84 922,84 922,84 922,84 922,84 922,84 
922,85 922,85 922,85 922,85 922,85 923,85 923,85 923,85 923,85 923,85 923,85 
923,85 923,85 923,85 923,85 923,85 923,85 923,85 923,85 923,85 923,85 923,85 
924,85 924,85 924,85 924,85 924,8 [...]
+  <polygon opacity="1" fill="#1F78B4" points="149,52 149,52 149,52 149,52 
150,52 150,52 150,52 150,52 150,52 150,52 150,52 150,52 150,52 150,52 150,52 
150,52 150,52 150,52 150,52 150,52 150,52 150,52 150,52 150,52 150,52 150,52 
150,52 150,52 150,52 150,52 150,52 150,52 150,52 150,52 150,52 150,52 150,52 
150,52 150,52 150,52 150,52 150,52 150,52 150,52 150,52 150,52 150,52 150,52 
150,52 150,52 150,52 150,52 150,52 150,52 150,52 150,52 150,52 150,52 150,52 
150,52 150,52 150,52 150,52 151,5 [...]
+  <polygon opacity="1" fill="#1F78B4" points="149,52 149,52 149,52 149,52 
150,52 150,52 150,52 150,52 150,52 150,52 150,52 150,52 150,52 150,52 150,52 
150,52 150,52 150,52 150,52 150,52 150,52 150,52 150,52 150,52 150,52 150,52 
150,52 150,52 150,52 150,52 150,52 150,52 150,53 150,53 150,53 150,53 150,53 
150,53 150,53 150,53 150,53 150,53 150,53 150,53 150,53 150,53 150,53 150,53 
150,53 150,53 150,53 150,53 150,53 150,53 150,53 150,53 150,53 150,53 150,53 
150,53 150,53 150,53 150,53 151,5 [...]
+</svg>
\ No newline at end of file
diff --git a/img/introducing-arrow-avro/write_violin_1m.svg 
b/img/introducing-arrow-avro/write_violin_1m.svg
new file mode 100644
index 00000000000..6b895b5965d
--- /dev/null
+++ b/img/introducing-arrow-avro/write_violin_1m.svg
@@ -0,0 +1,71 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg width="960" height="222" viewBox="0 0 960 222" 
xmlns="http://www.w3.org/2000/svg";>
+  <text x="480" y="5" dy="0.76em" text-anchor="middle" 
font-family="sans-serif" font-size="16.129032258064516" opacity="1" 
fill="#000000" style="white-space: pre;">
+W/1M: Violin plot
+</text>
+  <text x="528" y="212" dy="-0.5ex" text-anchor="middle" 
font-family="sans-serif" font-size="9.67741935483871" opacity="1" 
fill="#000000" style="white-space: pre;">
+Average time (ms)
+</text>
+  <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" 
points="105,36 105,163 "/>
+  <text style="font-size: 10.0645px; font-weight: 700; text-anchor: end; 
white-space: pre;" x="96" y="148" dy="0.5ex" transform="matrix(1, 0, 0, 1, 
1.006252, -6.945251)"><tspan x="96" dy="1em">​</tspan>apache-avro/h/1M<tspan 
x="96" dy="1em">​</tspan></text>
+  <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" 
points="100,148 105,148 "/>
+  <text style="font-size: 10.0645px; font-weight: 700; text-anchor: end; 
white-space: pre;" x="96" y="116" dy="0.5ex" transform="matrix(1, 0, 0, 1, 
0.389366, -6.730631)"><tspan x="96" dy="1em">​</tspan>arrow-avro/h/1M<tspan 
x="96" dy="1em">​</tspan></text>
+  <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" 
points="100,116 105,116 "/>
+  <text style="font-size: 10.0645px; font-weight: 700; text-anchor: end; 
white-space: pre;" x="96" y="84" dy="0.5ex" transform="matrix(1, 0, 0, 1, 
0.198201, -6.720076)"><tspan x="96" dy="1em">​</tspan>apache-avro/c/1M<tspan 
x="96" dy="1em">​</tspan></text>
+  <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" 
points="100,84 105,84 "/>
+  <text style="font-size: 10.0645px; font-weight: 700; text-anchor: end; 
white-space: pre;" x="96" y="52" dy="0.5ex" transform="matrix(1, 0, 0, 1, 0, 
-6.752914)"><tspan x="96" dy="1em">​</tspan>arrow-avro/c/1M<tspan x="96" 
dy="1em">​</tspan></text>
+  <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" 
points="100,52 105,52 "/>
+  <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" 
points="106,164 949,164 "/>
+  <text x="106" y="174" dy="0.76em" text-anchor="middle" 
font-family="sans-serif" font-size="9.67741935483871" opacity="1" 
fill="#000000" style="white-space: pre;">
+0.0
+</text>
+  <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" 
points="106,164 106,169 "/>
+  <text x="188" y="174" dy="0.76em" text-anchor="middle" 
font-family="sans-serif" font-size="9.67741935483871" opacity="1" 
fill="#000000" style="white-space: pre;">
+50.0
+</text>
+  <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" 
points="188,164 188,169 "/>
+  <text x="270" y="174" dy="0.76em" text-anchor="middle" 
font-family="sans-serif" font-size="9.67741935483871" opacity="1" 
fill="#000000" style="white-space: pre;">
+100.0
+</text>
+  <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" 
points="270,164 270,169 "/>
+  <text x="352" y="174" dy="0.76em" text-anchor="middle" 
font-family="sans-serif" font-size="9.67741935483871" opacity="1" 
fill="#000000" style="white-space: pre;">
+150.0
+</text>
+  <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" 
points="352,164 352,169 "/>
+  <text x="434" y="174" dy="0.76em" text-anchor="middle" 
font-family="sans-serif" font-size="9.67741935483871" opacity="1" 
fill="#000000" style="white-space: pre;">
+200.0
+</text>
+  <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" 
points="434,164 434,169 "/>
+  <text x="516" y="174" dy="0.76em" text-anchor="middle" 
font-family="sans-serif" font-size="9.67741935483871" opacity="1" 
fill="#000000" style="white-space: pre;">
+250.0
+</text>
+  <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" 
points="516,164 516,169 "/>
+  <text x="598" y="174" dy="0.76em" text-anchor="middle" 
font-family="sans-serif" font-size="9.67741935483871" opacity="1" 
fill="#000000" style="white-space: pre;">
+300.0
+</text>
+  <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" 
points="598,164 598,169 "/>
+  <text x="680" y="174" dy="0.76em" text-anchor="middle" 
font-family="sans-serif" font-size="9.67741935483871" opacity="1" 
fill="#000000" style="white-space: pre;">
+350.0
+</text>
+  <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" 
points="680,164 680,169 "/>
+  <text x="762" y="174" dy="0.76em" text-anchor="middle" 
font-family="sans-serif" font-size="9.67741935483871" opacity="1" 
fill="#000000" style="white-space: pre;">
+400.0
+</text>
+  <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" 
points="762,164 762,169 "/>
+  <text x="844" y="174" dy="0.76em" text-anchor="middle" 
font-family="sans-serif" font-size="9.67741935483871" opacity="1" 
fill="#000000" style="white-space: pre;">
+450.0
+</text>
+  <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" 
points="844,164 844,169 "/>
+  <text x="926" y="174" dy="0.76em" text-anchor="middle" 
font-family="sans-serif" font-size="9.67741935483871" opacity="1" 
fill="#000000" style="white-space: pre;">
+500.0
+</text>
+  <polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" 
points="926,164 926,169 "/>
+  <polygon opacity="1" fill="#1F78B4" points="239,148 239,148 239,148 239,148 
239,148 239,148 239,148 239,148 239,148 239,148 239,148 239,148 239,147 239,147 
239,147 239,147 239,147 239,147 239,147 239,147 239,147 239,147 239,147 239,147 
239,147 239,147 239,147 239,147 239,147 239,147 239,147 239,147 240,147 240,147 
240,147 240,147 240,147 240,147 240,147 240,147 240,147 240,147 240,147 240,146 
240,146 240,146 240,146 240,146 240,146 240,146 240,146 240,146 240,146 240,146 
240,146 240,14 [...]
+  <polygon opacity="1" fill="#1F78B4" points="239,148 239,148 239,148 239,148 
239,148 239,148 239,148 239,148 239,148 239,148 239,148 239,148 239,148 239,148 
239,148 239,148 239,148 239,148 239,148 239,148 239,148 239,148 239,148 239,148 
239,148 239,148 239,148 239,148 239,148 239,148 239,148 239,148 240,148 240,148 
240,148 240,148 240,148 240,148 240,148 240,149 240,149 240,149 240,149 240,149 
240,149 240,149 240,149 240,149 240,149 240,149 240,149 240,149 240,149 240,150 
240,150 240,15 [...]
+  <polygon opacity="1" fill="#1F78B4" points="162,116 162,116 162,116 162,116 
162,116 162,116 162,116 162,116 162,116 162,116 163,116 163,116 163,116 163,116 
163,116 163,116 163,116 163,116 163,116 163,116 163,116 163,116 163,116 163,116 
163,116 163,116 163,116 163,116 163,116 163,116 163,115 163,115 163,115 163,115 
163,115 163,115 163,115 163,115 163,115 163,115 163,115 163,115 163,115 163,115 
163,115 163,115 163,115 163,115 163,115 163,115 163,115 163,115 163,114 163,114 
163,114 163,11 [...]
+  <polygon opacity="1" fill="#1F78B4" points="162,116 162,116 162,116 162,116 
162,116 162,116 162,116 162,116 162,116 162,116 163,116 163,116 163,116 163,116 
163,116 163,116 163,116 163,116 163,116 163,116 163,116 163,116 163,116 163,116 
163,116 163,116 163,116 163,116 163,116 163,116 163,116 163,116 163,116 163,116 
163,116 163,116 163,116 163,116 163,117 163,117 163,117 163,117 163,117 163,117 
163,117 163,117 163,117 163,117 163,117 163,117 163,117 163,117 163,117 163,117 
163,117 163,11 [...]
+  <polygon opacity="1" fill="#1F78B4" points="877,84 877,84 878,84 878,84 
878,84 878,84 878,84 878,84 878,84 879,84 879,84 879,84 879,84 879,84 879,84 
879,84 880,84 880,84 880,84 880,84 880,84 880,84 880,84 881,84 881,84 881,84 
881,84 881,84 881,84 881,84 882,84 882,84 882,84 882,84 882,84 882,84 882,84 
883,83 883,83 883,83 883,83 883,83 883,83 883,83 884,83 884,83 884,83 884,83 
884,83 884,83 884,83 885,83 885,83 885,83 885,83 885,82 885,82 885,82 886,82 
886,82 886,82 886,82 886,82 886,8 [...]
+  <polygon opacity="1" fill="#1F78B4" points="877,84 877,84 878,84 878,84 
878,84 878,84 878,84 878,84 878,84 879,84 879,84 879,84 879,84 879,84 879,84 
879,84 880,84 880,84 880,84 880,84 880,84 880,84 880,84 881,84 881,84 881,84 
881,84 881,84 881,84 881,85 882,85 882,85 882,85 882,85 882,85 882,85 882,85 
883,85 883,85 883,85 883,85 883,85 883,85 883,85 884,85 884,85 884,85 884,85 
884,85 884,85 884,85 885,85 885,86 885,86 885,86 885,86 885,86 885,86 886,86 
886,86 886,86 886,86 886,86 886,8 [...]
+  <polygon opacity="1" fill="#1F78B4" points="164,52 164,52 164,52 164,52 
164,52 164,52 164,52 164,52 164,52 164,52 164,52 164,52 164,52 164,52 164,52 
164,52 164,52 164,52 164,52 164,52 164,52 164,52 164,52 164,52 164,52 164,52 
164,52 164,52 164,52 164,52 164,52 164,52 164,52 164,52 164,52 164,52 164,52 
164,52 164,52 164,52 164,52 164,52 164,52 164,52 164,52 164,52 164,52 164,52 
164,52 164,52 164,52 164,52 164,52 164,52 164,51 164,51 164,51 164,51 164,51 
164,51 164,51 164,51 165,51 165,5 [...]
+  <polygon opacity="1" fill="#1F78B4" points="164,52 164,52 164,52 164,52 
164,52 164,52 164,52 164,52 164,52 164,52 164,52 164,52 164,52 164,52 164,52 
164,52 164,52 164,52 164,52 164,52 164,52 164,52 164,52 164,52 164,53 164,53 
164,53 164,53 164,53 164,53 164,53 164,53 164,53 164,53 164,53 164,53 164,53 
164,53 164,53 164,53 164,53 164,53 164,53 164,53 164,53 164,53 164,53 164,53 
164,53 164,53 164,53 164,53 164,53 164,53 164,53 164,53 164,53 164,53 164,53 
164,54 164,54 164,54 165,54 165,5 [...]
+</svg>
\ No newline at end of file

Reply via email to