You are viewing a plain text version of this content. The canonical link for it is here.
Posted to github@arrow.apache.org by "korowa (via GitHub)" <gi...@apache.org> on 2024/06/08 12:57:08 UTC
[PR] minor: encode primitives to row-format without `skip` [arrow-rs]
korowa opened a new pull request, #5858:
URL: https://github.com/apache/arrow-rs/pull/5858
# Which issue does this PR close?
<!--
We generally require a GitHub issue to be filed for all bug fixes and enhancements and this helps us generate change logs for our releases. You can link an issue to this PR using the GitHub syntax. For example `Closes #123` indicates that this PR will close issue #123.
-->
--
# Rationale for this change
<!--
Why are you proposing this change? If this is already explained clearly in the issue then this section is not needed.
Explaining clearly why changes are proposed helps reviewers understand your changes and offer better suggestions for fixes.
-->
In some cases, `skip()` iterator may noticeably affect performance -- encoding primitive arrays into Arrow rows is one of them -- removing `skip().zip()` shows significant improvement over current master.
<details>
<summary>cargo bench</summary>
```
eduard@Aspire-A515-58M:~/projects/arrow-rs$ cargo bench --bench row_format -- "4096 [ui]64\(0\)" --baseline master
Compiling arrow-row v52.0.0 (/home/eduard/projects/arrow-rs/arrow-row)
Compiling arrow v52.0.0 (/home/eduard/projects/arrow-rs/arrow)
Finished `bench` profile [optimized] target(s) in 3.68s
Running benches/row_format.rs (target/release/deps/row_format-fa578ffd3df1630f)
convert_columns 4096 u64(0)
time: [12.356 µs 12.466 µs 12.596 µs]
change: [-28.482% -28.024% -27.509%] (p = 0.00 < 0.05)
Performance has improved.
Found 6 outliers among 100 measurements (6.00%)
6 (6.00%) high mild
convert_columns_prepared 4096 u64(0)
time: [12.049 µs 12.092 µs 12.141 µs]
change: [-29.882% -29.574% -29.194%] (p = 0.00 < 0.05)
Performance has improved.
Found 2 outliers among 100 measurements (2.00%)
2 (2.00%) high mild
convert_rows 4096 u64(0)
time: [28.008 µs 28.100 µs 28.202 µs]
change: [+0.4029% +0.8994% +1.4073%] (p = 0.00 < 0.05)
Change within noise threshold.
Found 3 outliers among 100 measurements (3.00%)
3 (3.00%) high mild
convert_columns 4096 i64(0)
time: [12.334 µs 12.419 µs 12.511 µs]
change: [-29.175% -28.694% -28.134%] (p = 0.00 < 0.05)
Performance has improved.
Found 3 outliers among 100 measurements (3.00%)
2 (2.00%) high mild
1 (1.00%) high severe
convert_columns_prepared 4096 i64(0)
time: [12.115 µs 12.164 µs 12.215 µs]
change: [-30.945% -30.217% -29.583%] (p = 0.00 < 0.05)
Performance has improved.
convert_rows 4096 i64(0)
time: [28.064 µs 28.138 µs 28.218 µs]
change: [-2.9919% -0.8739% +0.9863%] (p = 0.42 > 0.05)
No change in performance detected.
Found 9 outliers among 100 measurements (9.00%)
8 (8.00%) high mild
1 (1.00%) high severe
```
</details>
FWIW: +- same trick for fixed binary / string columns didn't show any meaningful (and stable) improvements.
# What changes are included in this PR?
<!--
There is no need to duplicate the description in the issue here but it is sometimes worth providing a summary of the individual changes in this PR.
-->
Chained iterators in arrow-row primitive encoding replaced with plain input iterator + "manually" controlled offset index
# Are there any user-facing changes?
No
<!--
If there are user-facing changes then we may require documentation to be updated before approving the PR.
-->
<!---
If there are any breaking changes to public APIs, please add the `breaking change` label.
-->
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: github-unsubscribe@arrow.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
Re: [PR] minor: faster primitive arrays encoding into row format [arrow-rs]
Posted by "korowa (via GitHub)" <gi...@apache.org>.
korowa commented on PR #5858:
URL: https://github.com/apache/arrow-rs/pull/5858#issuecomment-2166454578
@alamb @tustvold sorry for the late response.
Actually benchmark results are a bit unexpected (since encoding performance is the same for nullable and non-nullable columns), so I'd like to verify them, and also work on @tustvold 's comments.
Thank you.
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: github-unsubscribe@arrow.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
Re: [PR] minor: faster primitive arrays encoding into row format [arrow-rs]
Posted by "korowa (via GitHub)" <gi...@apache.org>.
korowa commented on PR #5858:
URL: https://github.com/apache/arrow-rs/pull/5858#issuecomment-2185010552
> I ran these numbers several times and they keep coming back slower. I may be doing something wrong
@alamb, the script looks correct (it does what's expected), but still I'm not able to reproduce 20% diff for decoding.
I've temporarily added workflow to run row-format bench on github runner and check the results.
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: github-unsubscribe@arrow.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
Re: [PR] minor: faster primitive arrays encoding into row format [arrow-rs]
Posted by "korowa (via GitHub)" <gi...@apache.org>.
korowa commented on code in PR #5858:
URL: https://github.com/apache/arrow-rs/pull/5858#discussion_r1644964810
##########
arrow-row/src/fixed.rs:
##########
@@ -216,14 +216,80 @@ where
///
/// - 1 byte `0` if null or `1` if valid
/// - bytes of [`FixedLengthEncoding`]
-pub fn encode<T: FixedLengthEncoding, I: IntoIterator<Item = Option<T>>>(
+pub fn encode<T: ArrowPrimitiveType>(
data: &mut [u8],
offsets: &mut [usize],
- i: I,
+ array: &PrimitiveArray<T>,
+ opts: SortOptions,
+) where
+ T::Native: FixedLengthEncoding,
+{
+ let mut offset_idx = 1;
+ for maybe_val in array {
+ let offset = &mut offsets[offset_idx];
+ let end_offset = *offset + T::Native::ENCODED_LEN;
+ if let Some(val) = maybe_val {
+ let to_write = &mut data[*offset..end_offset];
+ to_write[0] = 1;
+ let mut encoded = val.encode();
+ if opts.descending {
+ // Flip bits to reverse order
+ encoded.as_mut().iter_mut().for_each(|v| *v = !*v)
+ }
+ to_write[1..].copy_from_slice(encoded.as_ref())
+ } else {
+ data[*offset] = null_sentinel(opts);
+ }
+ *offset = end_offset;
+ offset_idx += 1;
+ }
+}
+
+/// Encoding for non-nullable primitive arrays.
+/// Iterates directly over the `values`, and skips NULLs-checking.
+pub fn encode_not_null<T: ArrowPrimitiveType>(
+ data: &mut [u8],
+ offsets: &mut [usize],
+ array: &PrimitiveArray<T>,
+ opts: SortOptions,
+) where
+ T::Native: FixedLengthEncoding,
+{
+ assert!(!array.is_nullable());
+
+ let mut offset_idx = 1;
+ for val in array.values() {
+ let offset = &mut offsets[offset_idx];
+ let end_offset = *offset + T::Native::ENCODED_LEN;
+
+ let to_write = &mut data[*offset..end_offset];
+ to_write[0] = 1;
+ let mut encoded = val.encode();
+ if opts.descending {
Review Comment:
I guess it'll be a follow up (need a bit more time with it) -- as for now after quick check, for non-nullable columns, encoded with descending order
```rs
if opts.descending {
// Flip bits to reverse order for encoded data skipping validity byte
for offset_idx in 1..offsets.len() {
let end_offset = offsets[offset_idx];
let buf = &mut data[end_offset-T::ENCODED_LEN+1..end_offset];
buf.iter_mut().for_each(|v| *v = !*v);
}
}
```
after "main" loop shows `[9.7890 µs 9.9628 µs 10.196 µs]` vs `[12.391 µs 12.448 µs 12.545 µs]`, so there may be an improvement, but it's a bit unclear for nullable columns (don't have any solution with meaningful improvement yet).
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: github-unsubscribe@arrow.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
Re: [PR] minor: faster primitive arrays encoding into row format [arrow-rs]
Posted by "tustvold (via GitHub)" <gi...@apache.org>.
tustvold commented on code in PR #5858:
URL: https://github.com/apache/arrow-rs/pull/5858#discussion_r1634819518
##########
arrow-row/src/fixed.rs:
##########
@@ -216,14 +216,80 @@ where
///
/// - 1 byte `0` if null or `1` if valid
/// - bytes of [`FixedLengthEncoding`]
-pub fn encode<T: FixedLengthEncoding, I: IntoIterator<Item = Option<T>>>(
+pub fn encode<T: ArrowPrimitiveType>(
data: &mut [u8],
offsets: &mut [usize],
- i: I,
+ array: &PrimitiveArray<T>,
+ opts: SortOptions,
+) where
+ T::Native: FixedLengthEncoding,
+{
+ let mut offset_idx = 1;
+ for maybe_val in array {
+ let offset = &mut offsets[offset_idx];
+ let end_offset = *offset + T::Native::ENCODED_LEN;
+ if let Some(val) = maybe_val {
+ let to_write = &mut data[*offset..end_offset];
+ to_write[0] = 1;
+ let mut encoded = val.encode();
+ if opts.descending {
+ // Flip bits to reverse order
+ encoded.as_mut().iter_mut().for_each(|v| *v = !*v)
+ }
+ to_write[1..].copy_from_slice(encoded.as_ref())
+ } else {
+ data[*offset] = null_sentinel(opts);
+ }
+ *offset = end_offset;
+ offset_idx += 1;
+ }
+}
+
+/// Encoding for non-nullable primitive arrays.
+/// Iterates directly over the `values`, and skips NULLs-checking.
+pub fn encode_not_null<T: ArrowPrimitiveType>(
Review Comment:
Similar to the above, passing in `values: &[T]` would make the lack of nulls explicit in the signature
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: github-unsubscribe@arrow.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
Re: [PR] minor: faster primitive arrays encoding into row format [arrow-rs]
Posted by "tustvold (via GitHub)" <gi...@apache.org>.
tustvold commented on code in PR #5858:
URL: https://github.com/apache/arrow-rs/pull/5858#discussion_r1634820653
##########
arrow-row/src/fixed.rs:
##########
@@ -216,14 +216,80 @@ where
///
/// - 1 byte `0` if null or `1` if valid
/// - bytes of [`FixedLengthEncoding`]
-pub fn encode<T: FixedLengthEncoding, I: IntoIterator<Item = Option<T>>>(
+pub fn encode<T: ArrowPrimitiveType>(
data: &mut [u8],
offsets: &mut [usize],
- i: I,
+ array: &PrimitiveArray<T>,
+ opts: SortOptions,
+) where
+ T::Native: FixedLengthEncoding,
+{
+ let mut offset_idx = 1;
+ for maybe_val in array {
+ let offset = &mut offsets[offset_idx];
+ let end_offset = *offset + T::Native::ENCODED_LEN;
+ if let Some(val) = maybe_val {
+ let to_write = &mut data[*offset..end_offset];
+ to_write[0] = 1;
+ let mut encoded = val.encode();
+ if opts.descending {
+ // Flip bits to reverse order
+ encoded.as_mut().iter_mut().for_each(|v| *v = !*v)
+ }
+ to_write[1..].copy_from_slice(encoded.as_ref())
+ } else {
+ data[*offset] = null_sentinel(opts);
+ }
+ *offset = end_offset;
+ offset_idx += 1;
+ }
+}
+
+/// Encoding for non-nullable primitive arrays.
+/// Iterates directly over the `values`, and skips NULLs-checking.
+pub fn encode_not_null<T: ArrowPrimitiveType>(
+ data: &mut [u8],
+ offsets: &mut [usize],
+ array: &PrimitiveArray<T>,
+ opts: SortOptions,
+) where
+ T::Native: FixedLengthEncoding,
+{
+ assert!(!array.is_nullable());
+
+ let mut offset_idx = 1;
+ for val in array.values() {
+ let offset = &mut offsets[offset_idx];
+ let end_offset = *offset + T::Native::ENCODED_LEN;
+
+ let to_write = &mut data[*offset..end_offset];
+ to_write[0] = 1;
+ let mut encoded = val.encode();
+ if opts.descending {
Review Comment:
Perhaps LLVM is smart enough, but it might be interesting to see if pulling this out of the loop improves performance
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: github-unsubscribe@arrow.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
Re: [PR] minor: faster primitive arrays encoding into row format [arrow-rs]
Posted by "korowa (via GitHub)" <gi...@apache.org>.
korowa commented on PR #5858:
URL: https://github.com/apache/arrow-rs/pull/5858#issuecomment-2186302709
[Running](https://github.com/apache/arrow-rs/actions/runs/9635710705/job/26572788116?pr=5858#step:10:1) the full set of benchmarks also doesn't show any regressions (except `convert_columns 4096 string_dictionary_low_cardinality(30, 0) `, which is fine in previous run + `convert_columns_prepared 4096 string_dictionary_low_cardinality(30, 0)` and other string dictionaries with low cardinality didn't show slowdown)
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: github-unsubscribe@arrow.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
Re: [PR] minor: faster primitive arrays encoding into row format [arrow-rs]
Posted by "alamb (via GitHub)" <gi...@apache.org>.
alamb commented on PR #5858:
URL: https://github.com/apache/arrow-rs/pull/5858#issuecomment-2160661929
I took the liberty of merging this PR up from main to pick up the fixes for the MSRV CI chekc
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: github-unsubscribe@arrow.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
Re: [PR] minor: faster primitive arrays encoding into row format [arrow-rs]
Posted by "korowa (via GitHub)" <gi...@apache.org>.
korowa commented on code in PR #5858:
URL: https://github.com/apache/arrow-rs/pull/5858#discussion_r1644956911
##########
arrow-row/src/lib.rs:
##########
@@ -1146,9 +1146,21 @@ fn encode_column(
match encoder {
Encoder::Stateless => {
downcast_primitive_array! {
- column => fixed::encode(data, offsets, column, opts),
+ column => {
+ if column.is_nullable(){
Review Comment:
After switching to this expression, I've found out that it's more beneficial to iterate over `null`, picking valid values from `values` -- now nullable columns conversions is +- close to non-nullable
##########
arrow-row/src/fixed.rs:
##########
@@ -216,14 +216,80 @@ where
///
/// - 1 byte `0` if null or `1` if valid
/// - bytes of [`FixedLengthEncoding`]
-pub fn encode<T: FixedLengthEncoding, I: IntoIterator<Item = Option<T>>>(
+pub fn encode<T: ArrowPrimitiveType>(
data: &mut [u8],
offsets: &mut [usize],
- i: I,
+ array: &PrimitiveArray<T>,
Review Comment:
Done
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: github-unsubscribe@arrow.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
Re: [PR] minor: faster primitive arrays encoding into row format [arrow-rs]
Posted by "alamb (via GitHub)" <gi...@apache.org>.
alamb commented on PR #5858:
URL: https://github.com/apache/arrow-rs/pull/5858#issuecomment-2165428367
(we could try them as follow on PRs too)
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: github-unsubscribe@arrow.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
Re: [PR] minor: faster primitive arrays encoding into row format [arrow-rs]
Posted by "tustvold (via GitHub)" <gi...@apache.org>.
tustvold commented on code in PR #5858:
URL: https://github.com/apache/arrow-rs/pull/5858#discussion_r1634814827
##########
arrow-row/src/lib.rs:
##########
@@ -1146,9 +1146,21 @@ fn encode_column(
match encoder {
Encoder::Stateless => {
downcast_primitive_array! {
- column => fixed::encode(data, offsets, column, opts),
+ column => {
+ if column.is_nullable(){
Review Comment:
Typically we use `column.nulls().filter(|n| n.null_count() > 0)` or similar for switching on nullability, this allows getting the benefit if there are no nulls regardless of schema, but happy for this to be done as a separate PR
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: github-unsubscribe@arrow.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
Re: [PR] minor: faster primitive arrays encoding into row format [arrow-rs]
Posted by "korowa (via GitHub)" <gi...@apache.org>.
korowa commented on PR #5858:
URL: https://github.com/apache/arrow-rs/pull/5858#issuecomment-2176843855
@alamb @tustvold I suppose this version to be ready for merging -- could you, please, take a look when you have time?
And regarding benchmark results -- all the changes affect only `convert_columns` benchmarks, `convert_rows` ones should not be affected by this PR.
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: github-unsubscribe@arrow.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
Re: [PR] minor: faster primitive arrays encoding into row format [arrow-rs]
Posted by "tustvold (via GitHub)" <gi...@apache.org>.
tustvold commented on code in PR #5858:
URL: https://github.com/apache/arrow-rs/pull/5858#discussion_r1634818624
##########
arrow-row/src/fixed.rs:
##########
@@ -216,14 +216,80 @@ where
///
/// - 1 byte `0` if null or `1` if valid
/// - bytes of [`FixedLengthEncoding`]
-pub fn encode<T: FixedLengthEncoding, I: IntoIterator<Item = Option<T>>>(
+pub fn encode<T: ArrowPrimitiveType>(
data: &mut [u8],
offsets: &mut [usize],
- i: I,
+ array: &PrimitiveArray<T>,
Review Comment:
One option that would make the nullability explicit whilst also cutting down on codegen would be to have the following signature instead
```
pub fn encode<T: FixedLengthEncoding>(
data: &mut [u8],
offsets: &mut [usize],
values: &[T],
nulls: &NullBuffer
)
```
```
##########
arrow-row/src/fixed.rs:
##########
@@ -216,14 +216,80 @@ where
///
/// - 1 byte `0` if null or `1` if valid
/// - bytes of [`FixedLengthEncoding`]
-pub fn encode<T: FixedLengthEncoding, I: IntoIterator<Item = Option<T>>>(
+pub fn encode<T: ArrowPrimitiveType>(
data: &mut [u8],
offsets: &mut [usize],
- i: I,
+ array: &PrimitiveArray<T>,
Review Comment:
One option that would make the nullability explicit whilst also cutting down on codegen would be to have the following signature instead
```
pub fn encode<T: FixedLengthEncoding>(
data: &mut [u8],
offsets: &mut [usize],
values: &[T],
nulls: &NullBuffer
)
```
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: github-unsubscribe@arrow.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
Re: [PR] minor: faster primitive arrays encoding into row format [arrow-rs]
Posted by "alamb (via GitHub)" <gi...@apache.org>.
alamb commented on PR #5858:
URL: https://github.com/apache/arrow-rs/pull/5858#issuecomment-2163250063
I am running benchmarks now on a server
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: github-unsubscribe@arrow.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
Re: [PR] minor: faster primitive arrays encoding into row format [arrow-rs]
Posted by "alamb (via GitHub)" <gi...@apache.org>.
alamb commented on PR #5858:
URL: https://github.com/apache/arrow-rs/pull/5858#issuecomment-2165428044
@korowa -- please let me know what you would like to do with this PR. We can merge it as is, or would you like to try some of @tustvold 's suggestions?
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: github-unsubscribe@arrow.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
Re: [PR] minor: faster primitive arrays encoding into row format [arrow-rs]
Posted by "alamb (via GitHub)" <gi...@apache.org>.
alamb commented on PR #5858:
URL: https://github.com/apache/arrow-rs/pull/5858#issuecomment-2166529711
To make running benchmarks easier, perhaps we could pull them out into their own PR that we could merge into `master` independently to this PR
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: github-unsubscribe@arrow.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
Re: [PR] minor: faster primitive arrays encoding into row format [arrow-rs]
Posted by "korowa (via GitHub)" <gi...@apache.org>.
korowa commented on code in PR #5858:
URL: https://github.com/apache/arrow-rs/pull/5858#discussion_r1644957225
##########
arrow-row/src/fixed.rs:
##########
@@ -216,14 +216,80 @@ where
///
/// - 1 byte `0` if null or `1` if valid
/// - bytes of [`FixedLengthEncoding`]
-pub fn encode<T: FixedLengthEncoding, I: IntoIterator<Item = Option<T>>>(
+pub fn encode<T: ArrowPrimitiveType>(
data: &mut [u8],
offsets: &mut [usize],
- i: I,
+ array: &PrimitiveArray<T>,
+ opts: SortOptions,
+) where
+ T::Native: FixedLengthEncoding,
+{
+ let mut offset_idx = 1;
+ for maybe_val in array {
+ let offset = &mut offsets[offset_idx];
+ let end_offset = *offset + T::Native::ENCODED_LEN;
+ if let Some(val) = maybe_val {
+ let to_write = &mut data[*offset..end_offset];
+ to_write[0] = 1;
+ let mut encoded = val.encode();
+ if opts.descending {
+ // Flip bits to reverse order
+ encoded.as_mut().iter_mut().for_each(|v| *v = !*v)
+ }
+ to_write[1..].copy_from_slice(encoded.as_ref())
+ } else {
+ data[*offset] = null_sentinel(opts);
+ }
+ *offset = end_offset;
+ offset_idx += 1;
+ }
+}
+
+/// Encoding for non-nullable primitive arrays.
+/// Iterates directly over the `values`, and skips NULLs-checking.
+pub fn encode_not_null<T: ArrowPrimitiveType>(
Review Comment:
And also done.
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: github-unsubscribe@arrow.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org