wangrunji0408 commented on issue #11413:
URL: https://github.com/apache/datafusion/issues/11413#issuecomment-2242629113
> > An example would be
>
> FWIW this implementation of concat would likely perform pretty poorly
compared to a hand written one as it will both create and allocate a new
temporary `String` for each row (and then presumably copy that value into a
final StringArray/LargeStringArray).
>
> ```rust
> // declare concat
> #[function("concat(string, string) -> string")]
> #[function("concat(largestring, largestring) -> largestring")]
> fn concat(lhs: &str, rhs: &str) -> String {
> format!("{}{}", lhs, rhs)
> }
> ```
In this case, a writer-style return value is supported to avoid the overhead.
```rust
#[function("concat(string, string) -> string")]
#[function("concat(largestring, largestring) -> largestring")] // will be
supported soon
fn concat(lhs: &str, rhs: &str, output: &mut impl std::fmt::Write) {
write!(output, "{}{}", lhs, rhs).unwrap();
}
```
The same technique can be applied to `binary` and `largebinary`. However, it
is not yet implemented due to the lack of `impl std::io::Write for
(Large)BinaryBuilder` in arrow crate.
```rust
#[function("concat(binary, binary) -> binary")]
#[function("concat(largebinary, largebinary) -> largebinary")]
fn concat(lhs: &[u8], rhs: &[u8], output: &mut impl std::io::Write) {
output.write_all(lhs).unwrap();
output.write_all(rhs).unwrap();
}
```
--
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: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]