ARROW-12277: [Rust][DataFusion] Implement and test Count/Min/Max aggregates for Timestamp(_,_) - #9970

Closed
alamb wants to merge 2 commits into
apache:masterfrom
alamb:alamb/ARROW-12277-aggregate-timestamps
Closed

ARROW-12277: [Rust][DataFusion] Implement and test Count/Min/Max aggregates for Timestamp(_,_)#9970
alamb wants to merge 2 commits into
apache:masterfrom
alamb:alamb/ARROW-12277-aggregate-timestamps

Conversation

@alamb

@alambalamb commented Apr 9, 2021

Copy link
Copy Markdown
Contributor

Rationale:

If you try and aggregate (via MIN, for example) a column of a timestamp type, DataFusion generates an error:

Coercion from [Timestamp(Nanosecond, None)] to the signature Uniform(1, [Int8, Int16, Int32, Int64, UInt8, UInt16, UInt32, UInt64, Float32, Float64]) failed.

For example, from IOx

> show columns from t;
+---------------+--------------+------------+-------------+-----------------------------+-------------+
| table_catalog | table_schema | table_name | column_name | data_type | is_nullable |
+---------------+--------------+------------+-------------+-----------------------------+-------------+
| datafusion | public | t | a | Utf8 | NO |
| datafusion | public | t | b | Timestamp(Nanosecond, None) | NO |
+---------------+--------------+------------+-------------+-----------------------------+-------------+
2 row in set. Query took 0 seconds.
> select sum(b) from t;
Plan("Coercion from [Timestamp(Nanosecond, None)] to the signature Uniform(1, [Int8, Int16, Int32, Int64, UInt8, UInt16, UInt32, UInt64, Float32, Float64]) failed.")

Changes:

Add support for aggregating timestamp types and tests for same

Notes

Note this is follow on / more fleshing out of the work done in #9773 by @velvia (👋 thanks for adding Timestamps to ScalarValue)

Supporting AVG on timestamps is tracked by https://issues.apache.org/jira/browse/ARROW-12318. It is more involved (as currently Avg assumes the output type is always F64), and not important for myuse case at the moment.

@github-actions

Copy link
Copy Markdown

Comment threadrust/datafusion/src/scalar.rs Outdated

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I added support for TimestampSecond here and renamed ScalarValue::TimeMillisecond --> ScalarValue::TimestampMillisecond so that the ScalarValue enum type matches up with the DataType enum type name

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👍 Great to be consistent.
Not related to this PR necessarily but I'm going to work on support for converting date strings to timestamps of different resolutions. Right now only Nanos are supported, ideally we'd have to_timestamp(...) that allows choosing nanos, micros, millis, or seconds under the hood.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This error message is pretty horrible. I filed https://issues.apache.org/jira/browse/ARROW-12319 to track improving it

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Agreed, thanks for filing a ticket!

@alamb

Copy link
Copy Markdown
ContributorAuthor

FYI @Dandandan / @returnString

@returnStringreturnString left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'd just hit up against this exact issue this week with some silly SQL clients doing timestamp queries on boot - nice timing! Code looks good to me 👍

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What are the exact use cases for summing timestamps? When does it make sense?
It looks like PostgreSQL doesn't support it: https://www.postgresql.org/docs/13/functions-aggregate.html

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That's a good question. I can think of great uses for avg, and difference (latency between two timestamps), but not really for sum, other than that sum is an important part of computing average?

@Dandandan

Copy link
Copy Markdown
Contributor

Hey @alamb this is looking good.
I'm wondering whether we should support sum/avg for timestamp?

@alamb

Copy link
Copy Markdown
ContributorAuthor

What are the exact use cases for summing timestamps? When does it make sense?

@Dandandan that is an excellent question. I will freely admit I was just heads down trying to get all the aggregates working rather than thinking if I should be working. I can't think of any time that sum(timestamp) really makes sense to be honest.

Do you think I should remove support for summing timestamps?

As for AVG, I added a note to https://issues.apache.org/jira/browse/ARROW-12318 with your observation. 🤔 good question

@Dandandan

Dandandan commented Apr 11, 2021

Copy link
Copy Markdown
Contributor

What are the exact use cases for summing timestamps? When does it make sense?

@Dandandan that is an excellent question. I will freely admit I was just heads down trying to get all the aggregates working rather than thinking if I should be working. I can't think of any time that sum(timestamp) really makes sense to be honest.

Do you think I should remove support for summing timestamps?

As for AVG, I added a note to https://issues.apache.org/jira/browse/ARROW-12318 with your observation. 🤔 good question

At least would be best to remove support for sum, as we don't have an absolute zero for timestamps. For average, I think it may make some more sense, but I think the use case seems limited to me.

@alamb

Copy link
Copy Markdown
ContributorAuthor

At least would be best to remove support for sum, as we don't have an absolute zero for timestamps. For average, I think it may make some more sense, but I think the use case seems limited to me.

will do

@alamb

alamb commented Apr 12, 2021

Copy link
Copy Markdown
ContributorAuthor

At least would be best to remove support for sum, as we don't have an absolute zero for timestamps. For average, I think it may make some more sense, but I think the use case seems limited to me.

@Dandandan -- I just double checked and the IOx project actually has need of Sum (and Avg) for timestamps due to the semantics of the Flux and InfluxQL languages. I can implement this functionality for custom user defined aggregates if needed, but I would prefer having the functionality in DataFusion directly so that anyone else can potentially use it too

I don't really understand the comment about "absolute zero" for timestamps.

Would it be ok with you if I merged in support for Sum for timestamps?

@returnString

returnString commented Apr 12, 2021

Copy link
Copy Markdown
Contributor

Thinking more about this: do we need to be careful about numeric limits? E.g. the current implementation of AvgAccumulator in the physical plan tracks the whole sum and count, and does sum / count at the end, meaning we might hit i64::MAX in the sum component given enough entries in an avg input with a sufficiently high-precision timestamp type.

Edit: don't mind me, it forces an f64 accumulator - I saw ScalarValue and panicked :)

@Dandandan

Dandandan commented Apr 12, 2021

Copy link
Copy Markdown
Contributor

At least would be best to remove support for sum, as we don't have an absolute zero for timestamps. For average, I think it may make some more sense, but I think the use case seems limited to me.

@Dandandan -- I just double checked and the IOx project actually has need of Sum (and Avg) for timestamps due to the semantics of the Flux and InfluxQL languages. I can implement this functionality for custom user defined aggregates if needed, but I would prefer having the functionality in DataFusion directly so that anyone else can potentially use it too

I don't really understand the comment about "absolute zero" for timestamps.

Would it be ok with you if I merged in support for Sum for timestamps?

My reaction to enable sum for timestamps was that it depends on the starting/zero value for the value, in this case the UNIX epoch.
The result of a addition/sum on timestamp is meaningless as it depends on the choice of the value of zero (1980 + 1980 + 1980 = 2000!?, 1970 + 1970 = 1970!?, 1960 + 1960 = 1950!?). When we would change the zero value (to Jan 1 1900 for example), we would totally change the meaning of adding timestamps.

If there was an "actual" zero date (like Kelvin for example) summing the values makes sense but there isn't such a thing for timestamps of course.

@alamb
alambforce-pushed the alamb/ARROW-12277-aggregate-timestamps branch from 31bc7dd to 98e18e3CompareApril 12, 2021 17:09
@alamb

Copy link
Copy Markdown
ContributorAuthor

I have removed SUM from this PR and will figure out what IOx is doing that seems to require sum and doesn't make sense. Thanks @Dandandan

@DandandanDandandan left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks 👍 looks good. Let's see what we should do with sum later 🙂

@velviavelvia left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Great PR @alamb !

.await
.unwrap();

let expected = vec![

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Testing string formatting seems kinda yucky and prone to fail when the formatting changes. Is there a better way to test the output here?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks @velvia --In general I agree that checking string representations in tests is brittle when formatting changes.

In the case of sql / tabular output, I think it is the best alternative I have seen because:

  1. The output formatting does not change often
  2. Updating these tests are easy (simply copy/paste the output of the test failure into the test after verifying it)
  3. These tests follow the same pattern as the rest of the tests in this module

}

#[tokio::test]
async fn aggregate_timestamps_min() -> Result<()> {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Min and max definitely makes sense.

Comment threadrust/datafusion/src/scalar.rs Outdated

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👍 Great to be consistent.
Not related to this PR necessarily but I'm going to work on support for converting date strings to timestamps of different resolutions. Right now only Nanos are supported, ideally we'd have to_timestamp(...) that allows choosing nanos, micros, millis, or seconds under the hood.

/// "millis" --> TimestampMillisecondArray
/// "secs" --> TimestampSecondArray
/// "names" --> StringArray
pub fn make_timestamps() -> RecordBatch {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👍 this will be really useful.

@alambalamb changed the title ARROW-12277: [Rust][DataFusion] Implement Sum/Count/Min/Max aggregates for Timestamp(_,_)ARROW-12277: [Rust][DataFusion] Implement and test Count/Min/Max aggregates for Timestamp(_,_)Apr 13, 2021
@alambalamb closed this in 1ed6819Apr 13, 2021
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@alamb@Dandandan@returnString@velvia
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

ARROW-12277: [Rust][DataFusion] Implement and test Count/Min/Max aggregates for Timestamp(_,_) - #9970

Closed
alamb wants to merge 2 commits into
apache:masterfrom
alamb:alamb/ARROW-12277-aggregate-timestamps
Closed

ARROW-12277: [Rust][DataFusion] Implement and test Count/Min/Max aggregates for Timestamp(_,_)#9970
alamb wants to merge 2 commits into
apache:masterfrom
alamb:alamb/ARROW-12277-aggregate-timestamps

Conversation

@alamb

@alambalamb commented Apr 9, 2021

Copy link
Copy Markdown
Contributor

Rationale:

If you try and aggregate (via MIN, for example) a column of a timestamp type, DataFusion generates an error:

Coercion from [Timestamp(Nanosecond, None)] to the signature Uniform(1, [Int8, Int16, Int32, Int64, UInt8, UInt16, UInt32, UInt64, Float32, Float64]) failed.

For example, from IOx

> show columns from t;
+---------------+--------------+------------+-------------+-----------------------------+-------------+
| table_catalog | table_schema | table_name | column_name | data_type | is_nullable |
+---------------+--------------+------------+-------------+-----------------------------+-------------+
| datafusion | public | t | a | Utf8 | NO |
| datafusion | public | t | b | Timestamp(Nanosecond, None) | NO |
+---------------+--------------+------------+-------------+-----------------------------+-------------+
2 row in set. Query took 0 seconds.
> select sum(b) from t;
Plan("Coercion from [Timestamp(Nanosecond, None)] to the signature Uniform(1, [Int8, Int16, Int32, Int64, UInt8, UInt16, UInt32, UInt64, Float32, Float64]) failed.")

Changes:

Add support for aggregating timestamp types and tests for same

Notes

Note this is follow on / more fleshing out of the work done in #9773 by @velvia (👋 thanks for adding Timestamps to ScalarValue)

Supporting AVG on timestamps is tracked by https://issues.apache.org/jira/browse/ARROW-12318. It is more involved (as currently Avg assumes the output type is always F64), and not important for myuse case at the moment.

@github-actions

Copy link
Copy Markdown

Comment threadrust/datafusion/src/scalar.rs Outdated

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I added support for TimestampSecond here and renamed ScalarValue::TimeMillisecond --> ScalarValue::TimestampMillisecond so that the ScalarValue enum type matches up with the DataType enum type name

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👍 Great to be consistent.
Not related to this PR necessarily but I'm going to work on support for converting date strings to timestamps of different resolutions. Right now only Nanos are supported, ideally we'd have to_timestamp(...) that allows choosing nanos, micros, millis, or seconds under the hood.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This error message is pretty horrible. I filed https://issues.apache.org/jira/browse/ARROW-12319 to track improving it

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Agreed, thanks for filing a ticket!

@alamb

Copy link
Copy Markdown
ContributorAuthor

FYI @Dandandan / @returnString

@returnStringreturnString left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'd just hit up against this exact issue this week with some silly SQL clients doing timestamp queries on boot - nice timing! Code looks good to me 👍

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What are the exact use cases for summing timestamps? When does it make sense?
It looks like PostgreSQL doesn't support it: https://www.postgresql.org/docs/13/functions-aggregate.html

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That's a good question. I can think of great uses for avg, and difference (latency between two timestamps), but not really for sum, other than that sum is an important part of computing average?

@Dandandan

Copy link
Copy Markdown
Contributor

Hey @alamb this is looking good.
I'm wondering whether we should support sum/avg for timestamp?

@alamb

Copy link
Copy Markdown
ContributorAuthor

What are the exact use cases for summing timestamps? When does it make sense?

@Dandandan that is an excellent question. I will freely admit I was just heads down trying to get all the aggregates working rather than thinking if I should be working. I can't think of any time that sum(timestamp) really makes sense to be honest.

Do you think I should remove support for summing timestamps?

As for AVG, I added a note to https://issues.apache.org/jira/browse/ARROW-12318 with your observation. 🤔 good question

@Dandandan

Dandandan commented Apr 11, 2021

Copy link
Copy Markdown
Contributor

What are the exact use cases for summing timestamps? When does it make sense?

@Dandandan that is an excellent question. I will freely admit I was just heads down trying to get all the aggregates working rather than thinking if I should be working. I can't think of any time that sum(timestamp) really makes sense to be honest.

Do you think I should remove support for summing timestamps?

As for AVG, I added a note to https://issues.apache.org/jira/browse/ARROW-12318 with your observation. 🤔 good question

At least would be best to remove support for sum, as we don't have an absolute zero for timestamps. For average, I think it may make some more sense, but I think the use case seems limited to me.

@alamb

Copy link
Copy Markdown
ContributorAuthor

At least would be best to remove support for sum, as we don't have an absolute zero for timestamps. For average, I think it may make some more sense, but I think the use case seems limited to me.

will do

@alamb

alamb commented Apr 12, 2021

Copy link
Copy Markdown
ContributorAuthor

At least would be best to remove support for sum, as we don't have an absolute zero for timestamps. For average, I think it may make some more sense, but I think the use case seems limited to me.

@Dandandan -- I just double checked and the IOx project actually has need of Sum (and Avg) for timestamps due to the semantics of the Flux and InfluxQL languages. I can implement this functionality for custom user defined aggregates if needed, but I would prefer having the functionality in DataFusion directly so that anyone else can potentially use it too

I don't really understand the comment about "absolute zero" for timestamps.

Would it be ok with you if I merged in support for Sum for timestamps?

@returnString

returnString commented Apr 12, 2021

Copy link
Copy Markdown
Contributor

Thinking more about this: do we need to be careful about numeric limits? E.g. the current implementation of AvgAccumulator in the physical plan tracks the whole sum and count, and does sum / count at the end, meaning we might hit i64::MAX in the sum component given enough entries in an avg input with a sufficiently high-precision timestamp type.

Edit: don't mind me, it forces an f64 accumulator - I saw ScalarValue and panicked :)

@Dandandan

Dandandan commented Apr 12, 2021

Copy link
Copy Markdown
Contributor

At least would be best to remove support for sum, as we don't have an absolute zero for timestamps. For average, I think it may make some more sense, but I think the use case seems limited to me.

@Dandandan -- I just double checked and the IOx project actually has need of Sum (and Avg) for timestamps due to the semantics of the Flux and InfluxQL languages. I can implement this functionality for custom user defined aggregates if needed, but I would prefer having the functionality in DataFusion directly so that anyone else can potentially use it too

I don't really understand the comment about "absolute zero" for timestamps.

Would it be ok with you if I merged in support for Sum for timestamps?

My reaction to enable sum for timestamps was that it depends on the starting/zero value for the value, in this case the UNIX epoch.
The result of a addition/sum on timestamp is meaningless as it depends on the choice of the value of zero (1980 + 1980 + 1980 = 2000!?, 1970 + 1970 = 1970!?, 1960 + 1960 = 1950!?). When we would change the zero value (to Jan 1 1900 for example), we would totally change the meaning of adding timestamps.

If there was an "actual" zero date (like Kelvin for example) summing the values makes sense but there isn't such a thing for timestamps of course.

@alamb
alambforce-pushed the alamb/ARROW-12277-aggregate-timestamps branch from 31bc7dd to 98e18e3CompareApril 12, 2021 17:09
@alamb

Copy link
Copy Markdown
ContributorAuthor

I have removed SUM from this PR and will figure out what IOx is doing that seems to require sum and doesn't make sense. Thanks @Dandandan

@DandandanDandandan left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks 👍 looks good. Let's see what we should do with sum later 🙂

@velviavelvia left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Great PR @alamb !

.await
.unwrap();

let expected = vec![

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Testing string formatting seems kinda yucky and prone to fail when the formatting changes. Is there a better way to test the output here?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks @velvia --In general I agree that checking string representations in tests is brittle when formatting changes.

In the case of sql / tabular output, I think it is the best alternative I have seen because:

  1. The output formatting does not change often
  2. Updating these tests are easy (simply copy/paste the output of the test failure into the test after verifying it)
  3. These tests follow the same pattern as the rest of the tests in this module

}

#[tokio::test]
async fn aggregate_timestamps_min() -> Result<()> {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Min and max definitely makes sense.

Comment threadrust/datafusion/src/scalar.rs Outdated

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👍 Great to be consistent.
Not related to this PR necessarily but I'm going to work on support for converting date strings to timestamps of different resolutions. Right now only Nanos are supported, ideally we'd have to_timestamp(...) that allows choosing nanos, micros, millis, or seconds under the hood.

/// "millis" --> TimestampMillisecondArray
/// "secs" --> TimestampSecondArray
/// "names" --> StringArray
pub fn make_timestamps() -> RecordBatch {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👍 this will be really useful.

@alambalamb changed the title ARROW-12277: [Rust][DataFusion] Implement Sum/Count/Min/Max aggregates for Timestamp(_,_)ARROW-12277: [Rust][DataFusion] Implement and test Count/Min/Max aggregates for Timestamp(_,_)Apr 13, 2021
@alambalamb closed this in 1ed6819Apr 13, 2021
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@alamb@Dandandan@returnString@velvia
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

ARROW-12277: [Rust][DataFusion] Implement and test Count/Min/Max aggregates for Timestamp(_,_) - #9970

Closed
alamb wants to merge 2 commits into
apache:masterfrom
alamb:alamb/ARROW-12277-aggregate-timestamps
Closed

ARROW-12277: [Rust][DataFusion] Implement and test Count/Min/Max aggregates for Timestamp(_,_)#9970
alamb wants to merge 2 commits into
apache:masterfrom
alamb:alamb/ARROW-12277-aggregate-timestamps

Conversation

@alamb

@alambalamb commented Apr 9, 2021

Copy link
Copy Markdown
Contributor

Rationale:

If you try and aggregate (via MIN, for example) a column of a timestamp type, DataFusion generates an error:

Coercion from [Timestamp(Nanosecond, None)] to the signature Uniform(1, [Int8, Int16, Int32, Int64, UInt8, UInt16, UInt32, UInt64, Float32, Float64]) failed.

For example, from IOx

> show columns from t;
+---------------+--------------+------------+-------------+-----------------------------+-------------+
| table_catalog | table_schema | table_name | column_name | data_type | is_nullable |
+---------------+--------------+------------+-------------+-----------------------------+-------------+
| datafusion | public | t | a | Utf8 | NO |
| datafusion | public | t | b | Timestamp(Nanosecond, None) | NO |
+---------------+--------------+------------+-------------+-----------------------------+-------------+
2 row in set. Query took 0 seconds.
> select sum(b) from t;
Plan("Coercion from [Timestamp(Nanosecond, None)] to the signature Uniform(1, [Int8, Int16, Int32, Int64, UInt8, UInt16, UInt32, UInt64, Float32, Float64]) failed.")

Changes:

Add support for aggregating timestamp types and tests for same

Notes

Note this is follow on / more fleshing out of the work done in #9773 by @velvia (👋 thanks for adding Timestamps to ScalarValue)

Supporting AVG on timestamps is tracked by https://issues.apache.org/jira/browse/ARROW-12318. It is more involved (as currently Avg assumes the output type is always F64), and not important for myuse case at the moment.

@github-actions

Copy link
Copy Markdown

Comment threadrust/datafusion/src/scalar.rs Outdated

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I added support for TimestampSecond here and renamed ScalarValue::TimeMillisecond --> ScalarValue::TimestampMillisecond so that the ScalarValue enum type matches up with the DataType enum type name

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👍 Great to be consistent.
Not related to this PR necessarily but I'm going to work on support for converting date strings to timestamps of different resolutions. Right now only Nanos are supported, ideally we'd have to_timestamp(...) that allows choosing nanos, micros, millis, or seconds under the hood.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This error message is pretty horrible. I filed https://issues.apache.org/jira/browse/ARROW-12319 to track improving it

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Agreed, thanks for filing a ticket!

@alamb

Copy link
Copy Markdown
ContributorAuthor

FYI @Dandandan / @returnString

@returnStringreturnString left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'd just hit up against this exact issue this week with some silly SQL clients doing timestamp queries on boot - nice timing! Code looks good to me 👍

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What are the exact use cases for summing timestamps? When does it make sense?
It looks like PostgreSQL doesn't support it: https://www.postgresql.org/docs/13/functions-aggregate.html

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That's a good question. I can think of great uses for avg, and difference (latency between two timestamps), but not really for sum, other than that sum is an important part of computing average?

@Dandandan

Copy link
Copy Markdown
Contributor

Hey @alamb this is looking good.
I'm wondering whether we should support sum/avg for timestamp?

@alamb

Copy link
Copy Markdown
ContributorAuthor

What are the exact use cases for summing timestamps? When does it make sense?

@Dandandan that is an excellent question. I will freely admit I was just heads down trying to get all the aggregates working rather than thinking if I should be working. I can't think of any time that sum(timestamp) really makes sense to be honest.

Do you think I should remove support for summing timestamps?

As for AVG, I added a note to https://issues.apache.org/jira/browse/ARROW-12318 with your observation. 🤔 good question

@Dandandan

Dandandan commented Apr 11, 2021

Copy link
Copy Markdown
Contributor

What are the exact use cases for summing timestamps? When does it make sense?

@Dandandan that is an excellent question. I will freely admit I was just heads down trying to get all the aggregates working rather than thinking if I should be working. I can't think of any time that sum(timestamp) really makes sense to be honest.

Do you think I should remove support for summing timestamps?

As for AVG, I added a note to https://issues.apache.org/jira/browse/ARROW-12318 with your observation. 🤔 good question

At least would be best to remove support for sum, as we don't have an absolute zero for timestamps. For average, I think it may make some more sense, but I think the use case seems limited to me.

@alamb

Copy link
Copy Markdown
ContributorAuthor

At least would be best to remove support for sum, as we don't have an absolute zero for timestamps. For average, I think it may make some more sense, but I think the use case seems limited to me.

will do

@alamb

alamb commented Apr 12, 2021

Copy link
Copy Markdown
ContributorAuthor

At least would be best to remove support for sum, as we don't have an absolute zero for timestamps. For average, I think it may make some more sense, but I think the use case seems limited to me.

@Dandandan -- I just double checked and the IOx project actually has need of Sum (and Avg) for timestamps due to the semantics of the Flux and InfluxQL languages. I can implement this functionality for custom user defined aggregates if needed, but I would prefer having the functionality in DataFusion directly so that anyone else can potentially use it too

I don't really understand the comment about "absolute zero" for timestamps.

Would it be ok with you if I merged in support for Sum for timestamps?

@returnString

returnString commented Apr 12, 2021

Copy link
Copy Markdown
Contributor

Thinking more about this: do we need to be careful about numeric limits? E.g. the current implementation of AvgAccumulator in the physical plan tracks the whole sum and count, and does sum / count at the end, meaning we might hit i64::MAX in the sum component given enough entries in an avg input with a sufficiently high-precision timestamp type.

Edit: don't mind me, it forces an f64 accumulator - I saw ScalarValue and panicked :)

@Dandandan

Dandandan commented Apr 12, 2021

Copy link
Copy Markdown
Contributor

At least would be best to remove support for sum, as we don't have an absolute zero for timestamps. For average, I think it may make some more sense, but I think the use case seems limited to me.

@Dandandan -- I just double checked and the IOx project actually has need of Sum (and Avg) for timestamps due to the semantics of the Flux and InfluxQL languages. I can implement this functionality for custom user defined aggregates if needed, but I would prefer having the functionality in DataFusion directly so that anyone else can potentially use it too

I don't really understand the comment about "absolute zero" for timestamps.

Would it be ok with you if I merged in support for Sum for timestamps?

My reaction to enable sum for timestamps was that it depends on the starting/zero value for the value, in this case the UNIX epoch.
The result of a addition/sum on timestamp is meaningless as it depends on the choice of the value of zero (1980 + 1980 + 1980 = 2000!?, 1970 + 1970 = 1970!?, 1960 + 1960 = 1950!?). When we would change the zero value (to Jan 1 1900 for example), we would totally change the meaning of adding timestamps.

If there was an "actual" zero date (like Kelvin for example) summing the values makes sense but there isn't such a thing for timestamps of course.

@alamb
alambforce-pushed the alamb/ARROW-12277-aggregate-timestamps branch from 31bc7dd to 98e18e3CompareApril 12, 2021 17:09
@alamb

Copy link
Copy Markdown
ContributorAuthor

I have removed SUM from this PR and will figure out what IOx is doing that seems to require sum and doesn't make sense. Thanks @Dandandan

@DandandanDandandan left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks 👍 looks good. Let's see what we should do with sum later 🙂

@velviavelvia left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Great PR @alamb !

.await
.unwrap();

let expected = vec![

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Testing string formatting seems kinda yucky and prone to fail when the formatting changes. Is there a better way to test the output here?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks @velvia --In general I agree that checking string representations in tests is brittle when formatting changes.

In the case of sql / tabular output, I think it is the best alternative I have seen because:

  1. The output formatting does not change often
  2. Updating these tests are easy (simply copy/paste the output of the test failure into the test after verifying it)
  3. These tests follow the same pattern as the rest of the tests in this module

}

#[tokio::test]
async fn aggregate_timestamps_min() -> Result<()> {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Min and max definitely makes sense.

Comment threadrust/datafusion/src/scalar.rs Outdated

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👍 Great to be consistent.
Not related to this PR necessarily but I'm going to work on support for converting date strings to timestamps of different resolutions. Right now only Nanos are supported, ideally we'd have to_timestamp(...) that allows choosing nanos, micros, millis, or seconds under the hood.

/// "millis" --> TimestampMillisecondArray
/// "secs" --> TimestampSecondArray
/// "names" --> StringArray
pub fn make_timestamps() -> RecordBatch {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👍 this will be really useful.

@alambalamb changed the title ARROW-12277: [Rust][DataFusion] Implement Sum/Count/Min/Max aggregates for Timestamp(_,_)ARROW-12277: [Rust][DataFusion] Implement and test Count/Min/Max aggregates for Timestamp(_,_)Apr 13, 2021
@alambalamb closed this in 1ed6819Apr 13, 2021
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@alamb@Dandandan@returnString@velvia
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

ARROW-12277: [Rust][DataFusion] Implement and test Count/Min/Max aggregates for Timestamp(_,_) - #9970

Closed
alamb wants to merge 2 commits into
apache:masterfrom
alamb:alamb/ARROW-12277-aggregate-timestamps
Closed

ARROW-12277: [Rust][DataFusion] Implement and test Count/Min/Max aggregates for Timestamp(_,_)#9970
alamb wants to merge 2 commits into
apache:masterfrom
alamb:alamb/ARROW-12277-aggregate-timestamps

Conversation

@alamb

@alambalamb commented Apr 9, 2021

Copy link
Copy Markdown
Contributor

Rationale:

If you try and aggregate (via MIN, for example) a column of a timestamp type, DataFusion generates an error:

Coercion from [Timestamp(Nanosecond, None)] to the signature Uniform(1, [Int8, Int16, Int32, Int64, UInt8, UInt16, UInt32, UInt64, Float32, Float64]) failed.

For example, from IOx

> show columns from t;
+---------------+--------------+------------+-------------+-----------------------------+-------------+
| table_catalog | table_schema | table_name | column_name | data_type | is_nullable |
+---------------+--------------+------------+-------------+-----------------------------+-------------+
| datafusion | public | t | a | Utf8 | NO |
| datafusion | public | t | b | Timestamp(Nanosecond, None) | NO |
+---------------+--------------+------------+-------------+-----------------------------+-------------+
2 row in set. Query took 0 seconds.
> select sum(b) from t;
Plan("Coercion from [Timestamp(Nanosecond, None)] to the signature Uniform(1, [Int8, Int16, Int32, Int64, UInt8, UInt16, UInt32, UInt64, Float32, Float64]) failed.")

Changes:

Add support for aggregating timestamp types and tests for same

Notes

Note this is follow on / more fleshing out of the work done in #9773 by @velvia (👋 thanks for adding Timestamps to ScalarValue)

Supporting AVG on timestamps is tracked by https://issues.apache.org/jira/browse/ARROW-12318. It is more involved (as currently Avg assumes the output type is always F64), and not important for myuse case at the moment.

@github-actions

Copy link
Copy Markdown

Comment threadrust/datafusion/src/scalar.rs Outdated

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I added support for TimestampSecond here and renamed ScalarValue::TimeMillisecond --> ScalarValue::TimestampMillisecond so that the ScalarValue enum type matches up with the DataType enum type name

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👍 Great to be consistent.
Not related to this PR necessarily but I'm going to work on support for converting date strings to timestamps of different resolutions. Right now only Nanos are supported, ideally we'd have to_timestamp(...) that allows choosing nanos, micros, millis, or seconds under the hood.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This error message is pretty horrible. I filed https://issues.apache.org/jira/browse/ARROW-12319 to track improving it

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Agreed, thanks for filing a ticket!

@alamb

Copy link
Copy Markdown
ContributorAuthor

FYI @Dandandan / @returnString

@returnStringreturnString left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'd just hit up against this exact issue this week with some silly SQL clients doing timestamp queries on boot - nice timing! Code looks good to me 👍

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What are the exact use cases for summing timestamps? When does it make sense?
It looks like PostgreSQL doesn't support it: https://www.postgresql.org/docs/13/functions-aggregate.html

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That's a good question. I can think of great uses for avg, and difference (latency between two timestamps), but not really for sum, other than that sum is an important part of computing average?

@Dandandan

Copy link
Copy Markdown
Contributor

Hey @alamb this is looking good.
I'm wondering whether we should support sum/avg for timestamp?

@alamb

Copy link
Copy Markdown
ContributorAuthor

What are the exact use cases for summing timestamps? When does it make sense?

@Dandandan that is an excellent question. I will freely admit I was just heads down trying to get all the aggregates working rather than thinking if I should be working. I can't think of any time that sum(timestamp) really makes sense to be honest.

Do you think I should remove support for summing timestamps?

As for AVG, I added a note to https://issues.apache.org/jira/browse/ARROW-12318 with your observation. 🤔 good question

@Dandandan

Dandandan commented Apr 11, 2021

Copy link
Copy Markdown
Contributor

What are the exact use cases for summing timestamps? When does it make sense?

@Dandandan that is an excellent question. I will freely admit I was just heads down trying to get all the aggregates working rather than thinking if I should be working. I can't think of any time that sum(timestamp) really makes sense to be honest.

Do you think I should remove support for summing timestamps?

As for AVG, I added a note to https://issues.apache.org/jira/browse/ARROW-12318 with your observation. 🤔 good question

At least would be best to remove support for sum, as we don't have an absolute zero for timestamps. For average, I think it may make some more sense, but I think the use case seems limited to me.

@alamb

Copy link
Copy Markdown
ContributorAuthor

At least would be best to remove support for sum, as we don't have an absolute zero for timestamps. For average, I think it may make some more sense, but I think the use case seems limited to me.

will do

@alamb

alamb commented Apr 12, 2021

Copy link
Copy Markdown
ContributorAuthor

At least would be best to remove support for sum, as we don't have an absolute zero for timestamps. For average, I think it may make some more sense, but I think the use case seems limited to me.

@Dandandan -- I just double checked and the IOx project actually has need of Sum (and Avg) for timestamps due to the semantics of the Flux and InfluxQL languages. I can implement this functionality for custom user defined aggregates if needed, but I would prefer having the functionality in DataFusion directly so that anyone else can potentially use it too

I don't really understand the comment about "absolute zero" for timestamps.

Would it be ok with you if I merged in support for Sum for timestamps?

@returnString

returnString commented Apr 12, 2021

Copy link
Copy Markdown
Contributor

Thinking more about this: do we need to be careful about numeric limits? E.g. the current implementation of AvgAccumulator in the physical plan tracks the whole sum and count, and does sum / count at the end, meaning we might hit i64::MAX in the sum component given enough entries in an avg input with a sufficiently high-precision timestamp type.

Edit: don't mind me, it forces an f64 accumulator - I saw ScalarValue and panicked :)

@Dandandan

Dandandan commented Apr 12, 2021

Copy link
Copy Markdown
Contributor

At least would be best to remove support for sum, as we don't have an absolute zero for timestamps. For average, I think it may make some more sense, but I think the use case seems limited to me.

@Dandandan -- I just double checked and the IOx project actually has need of Sum (and Avg) for timestamps due to the semantics of the Flux and InfluxQL languages. I can implement this functionality for custom user defined aggregates if needed, but I would prefer having the functionality in DataFusion directly so that anyone else can potentially use it too

I don't really understand the comment about "absolute zero" for timestamps.

Would it be ok with you if I merged in support for Sum for timestamps?

My reaction to enable sum for timestamps was that it depends on the starting/zero value for the value, in this case the UNIX epoch.
The result of a addition/sum on timestamp is meaningless as it depends on the choice of the value of zero (1980 + 1980 + 1980 = 2000!?, 1970 + 1970 = 1970!?, 1960 + 1960 = 1950!?). When we would change the zero value (to Jan 1 1900 for example), we would totally change the meaning of adding timestamps.

If there was an "actual" zero date (like Kelvin for example) summing the values makes sense but there isn't such a thing for timestamps of course.

@alamb
alambforce-pushed the alamb/ARROW-12277-aggregate-timestamps branch from 31bc7dd to 98e18e3CompareApril 12, 2021 17:09
@alamb

Copy link
Copy Markdown
ContributorAuthor

I have removed SUM from this PR and will figure out what IOx is doing that seems to require sum and doesn't make sense. Thanks @Dandandan

@DandandanDandandan left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks 👍 looks good. Let's see what we should do with sum later 🙂

@velviavelvia left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Great PR @alamb !

.await
.unwrap();

let expected = vec![

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Testing string formatting seems kinda yucky and prone to fail when the formatting changes. Is there a better way to test the output here?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks @velvia --In general I agree that checking string representations in tests is brittle when formatting changes.

In the case of sql / tabular output, I think it is the best alternative I have seen because:

  1. The output formatting does not change often
  2. Updating these tests are easy (simply copy/paste the output of the test failure into the test after verifying it)
  3. These tests follow the same pattern as the rest of the tests in this module

}

#[tokio::test]
async fn aggregate_timestamps_min() -> Result<()> {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Min and max definitely makes sense.

Comment threadrust/datafusion/src/scalar.rs Outdated

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👍 Great to be consistent.
Not related to this PR necessarily but I'm going to work on support for converting date strings to timestamps of different resolutions. Right now only Nanos are supported, ideally we'd have to_timestamp(...) that allows choosing nanos, micros, millis, or seconds under the hood.

/// "millis" --> TimestampMillisecondArray
/// "secs" --> TimestampSecondArray
/// "names" --> StringArray
pub fn make_timestamps() -> RecordBatch {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👍 this will be really useful.

@alambalamb changed the title ARROW-12277: [Rust][DataFusion] Implement Sum/Count/Min/Max aggregates for Timestamp(_,_)ARROW-12277: [Rust][DataFusion] Implement and test Count/Min/Max aggregates for Timestamp(_,_)Apr 13, 2021
@alambalamb closed this in 1ed6819Apr 13, 2021
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@alamb@Dandandan@returnString@velvia
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

ARROW-12277: [Rust][DataFusion] Implement and test Count/Min/Max aggregates for Timestamp(_,_) - #9970

Closed
alamb wants to merge 2 commits into
apache:masterfrom
alamb:alamb/ARROW-12277-aggregate-timestamps
Closed

ARROW-12277: [Rust][DataFusion] Implement and test Count/Min/Max aggregates for Timestamp(_,_)#9970
alamb wants to merge 2 commits into
apache:masterfrom
alamb:alamb/ARROW-12277-aggregate-timestamps

Conversation

@alamb

@alambalamb commented Apr 9, 2021

Copy link
Copy Markdown
Contributor

Rationale:

If you try and aggregate (via MIN, for example) a column of a timestamp type, DataFusion generates an error:

Coercion from [Timestamp(Nanosecond, None)] to the signature Uniform(1, [Int8, Int16, Int32, Int64, UInt8, UInt16, UInt32, UInt64, Float32, Float64]) failed.

For example, from IOx

> show columns from t;
+---------------+--------------+------------+-------------+-----------------------------+-------------+
| table_catalog | table_schema | table_name | column_name | data_type | is_nullable |
+---------------+--------------+------------+-------------+-----------------------------+-------------+
| datafusion | public | t | a | Utf8 | NO |
| datafusion | public | t | b | Timestamp(Nanosecond, None) | NO |
+---------------+--------------+------------+-------------+-----------------------------+-------------+
2 row in set. Query took 0 seconds.
> select sum(b) from t;
Plan("Coercion from [Timestamp(Nanosecond, None)] to the signature Uniform(1, [Int8, Int16, Int32, Int64, UInt8, UInt16, UInt32, UInt64, Float32, Float64]) failed.")

Changes:

Add support for aggregating timestamp types and tests for same

Notes

Note this is follow on / more fleshing out of the work done in #9773 by @velvia (👋 thanks for adding Timestamps to ScalarValue)

Supporting AVG on timestamps is tracked by https://issues.apache.org/jira/browse/ARROW-12318. It is more involved (as currently Avg assumes the output type is always F64), and not important for myuse case at the moment.

@github-actions

Copy link
Copy Markdown

Comment threadrust/datafusion/src/scalar.rs Outdated

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I added support for TimestampSecond here and renamed ScalarValue::TimeMillisecond --> ScalarValue::TimestampMillisecond so that the ScalarValue enum type matches up with the DataType enum type name

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👍 Great to be consistent.
Not related to this PR necessarily but I'm going to work on support for converting date strings to timestamps of different resolutions. Right now only Nanos are supported, ideally we'd have to_timestamp(...) that allows choosing nanos, micros, millis, or seconds under the hood.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This error message is pretty horrible. I filed https://issues.apache.org/jira/browse/ARROW-12319 to track improving it

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Agreed, thanks for filing a ticket!

@alamb

Copy link
Copy Markdown
ContributorAuthor

FYI @Dandandan / @returnString

@returnStringreturnString left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'd just hit up against this exact issue this week with some silly SQL clients doing timestamp queries on boot - nice timing! Code looks good to me 👍

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What are the exact use cases for summing timestamps? When does it make sense?
It looks like PostgreSQL doesn't support it: https://www.postgresql.org/docs/13/functions-aggregate.html

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That's a good question. I can think of great uses for avg, and difference (latency between two timestamps), but not really for sum, other than that sum is an important part of computing average?

@Dandandan

Copy link
Copy Markdown
Contributor

Hey @alamb this is looking good.
I'm wondering whether we should support sum/avg for timestamp?

@alamb

Copy link
Copy Markdown
ContributorAuthor

What are the exact use cases for summing timestamps? When does it make sense?

@Dandandan that is an excellent question. I will freely admit I was just heads down trying to get all the aggregates working rather than thinking if I should be working. I can't think of any time that sum(timestamp) really makes sense to be honest.

Do you think I should remove support for summing timestamps?

As for AVG, I added a note to https://issues.apache.org/jira/browse/ARROW-12318 with your observation. 🤔 good question

@Dandandan

Dandandan commented Apr 11, 2021

Copy link
Copy Markdown
Contributor

What are the exact use cases for summing timestamps? When does it make sense?

@Dandandan that is an excellent question. I will freely admit I was just heads down trying to get all the aggregates working rather than thinking if I should be working. I can't think of any time that sum(timestamp) really makes sense to be honest.

Do you think I should remove support for summing timestamps?

As for AVG, I added a note to https://issues.apache.org/jira/browse/ARROW-12318 with your observation. 🤔 good question

At least would be best to remove support for sum, as we don't have an absolute zero for timestamps. For average, I think it may make some more sense, but I think the use case seems limited to me.

@alamb

Copy link
Copy Markdown
ContributorAuthor

At least would be best to remove support for sum, as we don't have an absolute zero for timestamps. For average, I think it may make some more sense, but I think the use case seems limited to me.

will do

@alamb

alamb commented Apr 12, 2021

Copy link
Copy Markdown
ContributorAuthor

At least would be best to remove support for sum, as we don't have an absolute zero for timestamps. For average, I think it may make some more sense, but I think the use case seems limited to me.

@Dandandan -- I just double checked and the IOx project actually has need of Sum (and Avg) for timestamps due to the semantics of the Flux and InfluxQL languages. I can implement this functionality for custom user defined aggregates if needed, but I would prefer having the functionality in DataFusion directly so that anyone else can potentially use it too

I don't really understand the comment about "absolute zero" for timestamps.

Would it be ok with you if I merged in support for Sum for timestamps?

@returnString

returnString commented Apr 12, 2021

Copy link
Copy Markdown
Contributor

Thinking more about this: do we need to be careful about numeric limits? E.g. the current implementation of AvgAccumulator in the physical plan tracks the whole sum and count, and does sum / count at the end, meaning we might hit i64::MAX in the sum component given enough entries in an avg input with a sufficiently high-precision timestamp type.

Edit: don't mind me, it forces an f64 accumulator - I saw ScalarValue and panicked :)

@Dandandan

Dandandan commented Apr 12, 2021

Copy link
Copy Markdown
Contributor

At least would be best to remove support for sum, as we don't have an absolute zero for timestamps. For average, I think it may make some more sense, but I think the use case seems limited to me.

@Dandandan -- I just double checked and the IOx project actually has need of Sum (and Avg) for timestamps due to the semantics of the Flux and InfluxQL languages. I can implement this functionality for custom user defined aggregates if needed, but I would prefer having the functionality in DataFusion directly so that anyone else can potentially use it too

I don't really understand the comment about "absolute zero" for timestamps.

Would it be ok with you if I merged in support for Sum for timestamps?

My reaction to enable sum for timestamps was that it depends on the starting/zero value for the value, in this case the UNIX epoch.
The result of a addition/sum on timestamp is meaningless as it depends on the choice of the value of zero (1980 + 1980 + 1980 = 2000!?, 1970 + 1970 = 1970!?, 1960 + 1960 = 1950!?). When we would change the zero value (to Jan 1 1900 for example), we would totally change the meaning of adding timestamps.

If there was an "actual" zero date (like Kelvin for example) summing the values makes sense but there isn't such a thing for timestamps of course.

@alamb
alambforce-pushed the alamb/ARROW-12277-aggregate-timestamps branch from 31bc7dd to 98e18e3CompareApril 12, 2021 17:09
@alamb

Copy link
Copy Markdown
ContributorAuthor

I have removed SUM from this PR and will figure out what IOx is doing that seems to require sum and doesn't make sense. Thanks @Dandandan

@DandandanDandandan left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks 👍 looks good. Let's see what we should do with sum later 🙂

@velviavelvia left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Great PR @alamb !

.await
.unwrap();

let expected = vec![

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Testing string formatting seems kinda yucky and prone to fail when the formatting changes. Is there a better way to test the output here?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks @velvia --In general I agree that checking string representations in tests is brittle when formatting changes.

In the case of sql / tabular output, I think it is the best alternative I have seen because:

  1. The output formatting does not change often
  2. Updating these tests are easy (simply copy/paste the output of the test failure into the test after verifying it)
  3. These tests follow the same pattern as the rest of the tests in this module

}

#[tokio::test]
async fn aggregate_timestamps_min() -> Result<()> {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Min and max definitely makes sense.

Comment threadrust/datafusion/src/scalar.rs Outdated

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👍 Great to be consistent.
Not related to this PR necessarily but I'm going to work on support for converting date strings to timestamps of different resolutions. Right now only Nanos are supported, ideally we'd have to_timestamp(...) that allows choosing nanos, micros, millis, or seconds under the hood.

/// "millis" --> TimestampMillisecondArray
/// "secs" --> TimestampSecondArray
/// "names" --> StringArray
pub fn make_timestamps() -> RecordBatch {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👍 this will be really useful.

@alambalamb changed the title ARROW-12277: [Rust][DataFusion] Implement Sum/Count/Min/Max aggregates for Timestamp(_,_)ARROW-12277: [Rust][DataFusion] Implement and test Count/Min/Max aggregates for Timestamp(_,_)Apr 13, 2021
@alambalamb closed this in 1ed6819Apr 13, 2021
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@alamb@Dandandan@returnString@velvia
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

ARROW-12277: [Rust][DataFusion] Implement and test Count/Min/Max aggregates for Timestamp(_,_) - #9970

Closed
alamb wants to merge 2 commits into
apache:masterfrom
alamb:alamb/ARROW-12277-aggregate-timestamps
Closed

ARROW-12277: [Rust][DataFusion] Implement and test Count/Min/Max aggregates for Timestamp(_,_)#9970
alamb wants to merge 2 commits into
apache:masterfrom
alamb:alamb/ARROW-12277-aggregate-timestamps

Conversation

@alamb

@alambalamb commented Apr 9, 2021

Copy link
Copy Markdown
Contributor

Rationale:

If you try and aggregate (via MIN, for example) a column of a timestamp type, DataFusion generates an error:

Coercion from [Timestamp(Nanosecond, None)] to the signature Uniform(1, [Int8, Int16, Int32, Int64, UInt8, UInt16, UInt32, UInt64, Float32, Float64]) failed.

For example, from IOx

> show columns from t;
+---------------+--------------+------------+-------------+-----------------------------+-------------+
| table_catalog | table_schema | table_name | column_name | data_type | is_nullable |
+---------------+--------------+------------+-------------+-----------------------------+-------------+
| datafusion | public | t | a | Utf8 | NO |
| datafusion | public | t | b | Timestamp(Nanosecond, None) | NO |
+---------------+--------------+------------+-------------+-----------------------------+-------------+
2 row in set. Query took 0 seconds.
> select sum(b) from t;
Plan("Coercion from [Timestamp(Nanosecond, None)] to the signature Uniform(1, [Int8, Int16, Int32, Int64, UInt8, UInt16, UInt32, UInt64, Float32, Float64]) failed.")

Changes:

Add support for aggregating timestamp types and tests for same

Notes

Note this is follow on / more fleshing out of the work done in #9773 by @velvia (👋 thanks for adding Timestamps to ScalarValue)

Supporting AVG on timestamps is tracked by https://issues.apache.org/jira/browse/ARROW-12318. It is more involved (as currently Avg assumes the output type is always F64), and not important for myuse case at the moment.

@github-actions

Copy link
Copy Markdown

Comment threadrust/datafusion/src/scalar.rs Outdated

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I added support for TimestampSecond here and renamed ScalarValue::TimeMillisecond --> ScalarValue::TimestampMillisecond so that the ScalarValue enum type matches up with the DataType enum type name

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👍 Great to be consistent.
Not related to this PR necessarily but I'm going to work on support for converting date strings to timestamps of different resolutions. Right now only Nanos are supported, ideally we'd have to_timestamp(...) that allows choosing nanos, micros, millis, or seconds under the hood.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This error message is pretty horrible. I filed https://issues.apache.org/jira/browse/ARROW-12319 to track improving it

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Agreed, thanks for filing a ticket!

@alamb

Copy link
Copy Markdown
ContributorAuthor

FYI @Dandandan / @returnString

@returnStringreturnString left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'd just hit up against this exact issue this week with some silly SQL clients doing timestamp queries on boot - nice timing! Code looks good to me 👍

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What are the exact use cases for summing timestamps? When does it make sense?
It looks like PostgreSQL doesn't support it: https://www.postgresql.org/docs/13/functions-aggregate.html

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That's a good question. I can think of great uses for avg, and difference (latency between two timestamps), but not really for sum, other than that sum is an important part of computing average?

@Dandandan

Copy link
Copy Markdown
Contributor

Hey @alamb this is looking good.
I'm wondering whether we should support sum/avg for timestamp?

@alamb

Copy link
Copy Markdown
ContributorAuthor

What are the exact use cases for summing timestamps? When does it make sense?

@Dandandan that is an excellent question. I will freely admit I was just heads down trying to get all the aggregates working rather than thinking if I should be working. I can't think of any time that sum(timestamp) really makes sense to be honest.

Do you think I should remove support for summing timestamps?

As for AVG, I added a note to https://issues.apache.org/jira/browse/ARROW-12318 with your observation. 🤔 good question

@Dandandan

Dandandan commented Apr 11, 2021

Copy link
Copy Markdown
Contributor

What are the exact use cases for summing timestamps? When does it make sense?

@Dandandan that is an excellent question. I will freely admit I was just heads down trying to get all the aggregates working rather than thinking if I should be working. I can't think of any time that sum(timestamp) really makes sense to be honest.

Do you think I should remove support for summing timestamps?

As for AVG, I added a note to https://issues.apache.org/jira/browse/ARROW-12318 with your observation. 🤔 good question

At least would be best to remove support for sum, as we don't have an absolute zero for timestamps. For average, I think it may make some more sense, but I think the use case seems limited to me.

@alamb

Copy link
Copy Markdown
ContributorAuthor

At least would be best to remove support for sum, as we don't have an absolute zero for timestamps. For average, I think it may make some more sense, but I think the use case seems limited to me.

will do

@alamb

alamb commented Apr 12, 2021

Copy link
Copy Markdown
ContributorAuthor

At least would be best to remove support for sum, as we don't have an absolute zero for timestamps. For average, I think it may make some more sense, but I think the use case seems limited to me.

@Dandandan -- I just double checked and the IOx project actually has need of Sum (and Avg) for timestamps due to the semantics of the Flux and InfluxQL languages. I can implement this functionality for custom user defined aggregates if needed, but I would prefer having the functionality in DataFusion directly so that anyone else can potentially use it too

I don't really understand the comment about "absolute zero" for timestamps.

Would it be ok with you if I merged in support for Sum for timestamps?

@returnString

returnString commented Apr 12, 2021

Copy link
Copy Markdown
Contributor

Thinking more about this: do we need to be careful about numeric limits? E.g. the current implementation of AvgAccumulator in the physical plan tracks the whole sum and count, and does sum / count at the end, meaning we might hit i64::MAX in the sum component given enough entries in an avg input with a sufficiently high-precision timestamp type.

Edit: don't mind me, it forces an f64 accumulator - I saw ScalarValue and panicked :)

@Dandandan

Dandandan commented Apr 12, 2021

Copy link
Copy Markdown
Contributor

At least would be best to remove support for sum, as we don't have an absolute zero for timestamps. For average, I think it may make some more sense, but I think the use case seems limited to me.

@Dandandan -- I just double checked and the IOx project actually has need of Sum (and Avg) for timestamps due to the semantics of the Flux and InfluxQL languages. I can implement this functionality for custom user defined aggregates if needed, but I would prefer having the functionality in DataFusion directly so that anyone else can potentially use it too

I don't really understand the comment about "absolute zero" for timestamps.

Would it be ok with you if I merged in support for Sum for timestamps?

My reaction to enable sum for timestamps was that it depends on the starting/zero value for the value, in this case the UNIX epoch.
The result of a addition/sum on timestamp is meaningless as it depends on the choice of the value of zero (1980 + 1980 + 1980 = 2000!?, 1970 + 1970 = 1970!?, 1960 + 1960 = 1950!?). When we would change the zero value (to Jan 1 1900 for example), we would totally change the meaning of adding timestamps.

If there was an "actual" zero date (like Kelvin for example) summing the values makes sense but there isn't such a thing for timestamps of course.

@alamb
alambforce-pushed the alamb/ARROW-12277-aggregate-timestamps branch from 31bc7dd to 98e18e3CompareApril 12, 2021 17:09
@alamb

Copy link
Copy Markdown
ContributorAuthor

I have removed SUM from this PR and will figure out what IOx is doing that seems to require sum and doesn't make sense. Thanks @Dandandan

@DandandanDandandan left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks 👍 looks good. Let's see what we should do with sum later 🙂

@velviavelvia left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Great PR @alamb !

.await
.unwrap();

let expected = vec![

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Testing string formatting seems kinda yucky and prone to fail when the formatting changes. Is there a better way to test the output here?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks @velvia --In general I agree that checking string representations in tests is brittle when formatting changes.

In the case of sql / tabular output, I think it is the best alternative I have seen because:

  1. The output formatting does not change often
  2. Updating these tests are easy (simply copy/paste the output of the test failure into the test after verifying it)
  3. These tests follow the same pattern as the rest of the tests in this module

}

#[tokio::test]
async fn aggregate_timestamps_min() -> Result<()> {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Min and max definitely makes sense.

Comment threadrust/datafusion/src/scalar.rs Outdated

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👍 Great to be consistent.
Not related to this PR necessarily but I'm going to work on support for converting date strings to timestamps of different resolutions. Right now only Nanos are supported, ideally we'd have to_timestamp(...) that allows choosing nanos, micros, millis, or seconds under the hood.

/// "millis" --> TimestampMillisecondArray
/// "secs" --> TimestampSecondArray
/// "names" --> StringArray
pub fn make_timestamps() -> RecordBatch {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👍 this will be really useful.

@alambalamb changed the title ARROW-12277: [Rust][DataFusion] Implement Sum/Count/Min/Max aggregates for Timestamp(_,_)ARROW-12277: [Rust][DataFusion] Implement and test Count/Min/Max aggregates for Timestamp(_,_)Apr 13, 2021
@alambalamb closed this in 1ed6819Apr 13, 2021
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@alamb@Dandandan@returnString@velvia
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

ARROW-12277: [Rust][DataFusion] Implement and test Count/Min/Max aggregates for Timestamp(_,_) - #9970

Closed
alamb wants to merge 2 commits into
apache:masterfrom
alamb:alamb/ARROW-12277-aggregate-timestamps
Closed

ARROW-12277: [Rust][DataFusion] Implement and test Count/Min/Max aggregates for Timestamp(_,_)#9970
alamb wants to merge 2 commits into
apache:masterfrom
alamb:alamb/ARROW-12277-aggregate-timestamps

Conversation

@alamb

@alambalamb commented Apr 9, 2021

Copy link
Copy Markdown
Contributor

Rationale:

If you try and aggregate (via MIN, for example) a column of a timestamp type, DataFusion generates an error:

Coercion from [Timestamp(Nanosecond, None)] to the signature Uniform(1, [Int8, Int16, Int32, Int64, UInt8, UInt16, UInt32, UInt64, Float32, Float64]) failed.

For example, from IOx

> show columns from t;
+---------------+--------------+------------+-------------+-----------------------------+-------------+
| table_catalog | table_schema | table_name | column_name | data_type | is_nullable |
+---------------+--------------+------------+-------------+-----------------------------+-------------+
| datafusion | public | t | a | Utf8 | NO |
| datafusion | public | t | b | Timestamp(Nanosecond, None) | NO |
+---------------+--------------+------------+-------------+-----------------------------+-------------+
2 row in set. Query took 0 seconds.
> select sum(b) from t;
Plan("Coercion from [Timestamp(Nanosecond, None)] to the signature Uniform(1, [Int8, Int16, Int32, Int64, UInt8, UInt16, UInt32, UInt64, Float32, Float64]) failed.")

Changes:

Add support for aggregating timestamp types and tests for same

Notes

Note this is follow on / more fleshing out of the work done in #9773 by @velvia (👋 thanks for adding Timestamps to ScalarValue)

Supporting AVG on timestamps is tracked by https://issues.apache.org/jira/browse/ARROW-12318. It is more involved (as currently Avg assumes the output type is always F64), and not important for myuse case at the moment.

@github-actions

Copy link
Copy Markdown

Comment threadrust/datafusion/src/scalar.rs Outdated

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I added support for TimestampSecond here and renamed ScalarValue::TimeMillisecond --> ScalarValue::TimestampMillisecond so that the ScalarValue enum type matches up with the DataType enum type name

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👍 Great to be consistent.
Not related to this PR necessarily but I'm going to work on support for converting date strings to timestamps of different resolutions. Right now only Nanos are supported, ideally we'd have to_timestamp(...) that allows choosing nanos, micros, millis, or seconds under the hood.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This error message is pretty horrible. I filed https://issues.apache.org/jira/browse/ARROW-12319 to track improving it

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Agreed, thanks for filing a ticket!

@alamb

Copy link
Copy Markdown
ContributorAuthor

FYI @Dandandan / @returnString

@returnStringreturnString left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'd just hit up against this exact issue this week with some silly SQL clients doing timestamp queries on boot - nice timing! Code looks good to me 👍

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What are the exact use cases for summing timestamps? When does it make sense?
It looks like PostgreSQL doesn't support it: https://www.postgresql.org/docs/13/functions-aggregate.html

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That's a good question. I can think of great uses for avg, and difference (latency between two timestamps), but not really for sum, other than that sum is an important part of computing average?

@Dandandan

Copy link
Copy Markdown
Contributor

Hey @alamb this is looking good.
I'm wondering whether we should support sum/avg for timestamp?

@alamb

Copy link
Copy Markdown
ContributorAuthor

What are the exact use cases for summing timestamps? When does it make sense?

@Dandandan that is an excellent question. I will freely admit I was just heads down trying to get all the aggregates working rather than thinking if I should be working. I can't think of any time that sum(timestamp) really makes sense to be honest.

Do you think I should remove support for summing timestamps?

As for AVG, I added a note to https://issues.apache.org/jira/browse/ARROW-12318 with your observation. 🤔 good question

@Dandandan

Dandandan commented Apr 11, 2021

Copy link
Copy Markdown
Contributor

What are the exact use cases for summing timestamps? When does it make sense?

@Dandandan that is an excellent question. I will freely admit I was just heads down trying to get all the aggregates working rather than thinking if I should be working. I can't think of any time that sum(timestamp) really makes sense to be honest.

Do you think I should remove support for summing timestamps?

As for AVG, I added a note to https://issues.apache.org/jira/browse/ARROW-12318 with your observation. 🤔 good question

At least would be best to remove support for sum, as we don't have an absolute zero for timestamps. For average, I think it may make some more sense, but I think the use case seems limited to me.

@alamb

Copy link
Copy Markdown
ContributorAuthor

At least would be best to remove support for sum, as we don't have an absolute zero for timestamps. For average, I think it may make some more sense, but I think the use case seems limited to me.

will do

@alamb

alamb commented Apr 12, 2021

Copy link
Copy Markdown
ContributorAuthor

At least would be best to remove support for sum, as we don't have an absolute zero for timestamps. For average, I think it may make some more sense, but I think the use case seems limited to me.

@Dandandan -- I just double checked and the IOx project actually has need of Sum (and Avg) for timestamps due to the semantics of the Flux and InfluxQL languages. I can implement this functionality for custom user defined aggregates if needed, but I would prefer having the functionality in DataFusion directly so that anyone else can potentially use it too

I don't really understand the comment about "absolute zero" for timestamps.

Would it be ok with you if I merged in support for Sum for timestamps?

@returnString

returnString commented Apr 12, 2021

Copy link
Copy Markdown
Contributor

Thinking more about this: do we need to be careful about numeric limits? E.g. the current implementation of AvgAccumulator in the physical plan tracks the whole sum and count, and does sum / count at the end, meaning we might hit i64::MAX in the sum component given enough entries in an avg input with a sufficiently high-precision timestamp type.

Edit: don't mind me, it forces an f64 accumulator - I saw ScalarValue and panicked :)

@Dandandan

Dandandan commented Apr 12, 2021

Copy link
Copy Markdown
Contributor

At least would be best to remove support for sum, as we don't have an absolute zero for timestamps. For average, I think it may make some more sense, but I think the use case seems limited to me.

@Dandandan -- I just double checked and the IOx project actually has need of Sum (and Avg) for timestamps due to the semantics of the Flux and InfluxQL languages. I can implement this functionality for custom user defined aggregates if needed, but I would prefer having the functionality in DataFusion directly so that anyone else can potentially use it too

I don't really understand the comment about "absolute zero" for timestamps.

Would it be ok with you if I merged in support for Sum for timestamps?

My reaction to enable sum for timestamps was that it depends on the starting/zero value for the value, in this case the UNIX epoch.
The result of a addition/sum on timestamp is meaningless as it depends on the choice of the value of zero (1980 + 1980 + 1980 = 2000!?, 1970 + 1970 = 1970!?, 1960 + 1960 = 1950!?). When we would change the zero value (to Jan 1 1900 for example), we would totally change the meaning of adding timestamps.

If there was an "actual" zero date (like Kelvin for example) summing the values makes sense but there isn't such a thing for timestamps of course.

@alamb
alambforce-pushed the alamb/ARROW-12277-aggregate-timestamps branch from 31bc7dd to 98e18e3CompareApril 12, 2021 17:09
@alamb

Copy link
Copy Markdown
ContributorAuthor

I have removed SUM from this PR and will figure out what IOx is doing that seems to require sum and doesn't make sense. Thanks @Dandandan

@DandandanDandandan left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks 👍 looks good. Let's see what we should do with sum later 🙂

@velviavelvia left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Great PR @alamb !

.await
.unwrap();

let expected = vec![

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Testing string formatting seems kinda yucky and prone to fail when the formatting changes. Is there a better way to test the output here?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks @velvia --In general I agree that checking string representations in tests is brittle when formatting changes.

In the case of sql / tabular output, I think it is the best alternative I have seen because:

  1. The output formatting does not change often
  2. Updating these tests are easy (simply copy/paste the output of the test failure into the test after verifying it)
  3. These tests follow the same pattern as the rest of the tests in this module

}

#[tokio::test]
async fn aggregate_timestamps_min() -> Result<()> {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Min and max definitely makes sense.

Comment threadrust/datafusion/src/scalar.rs Outdated

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👍 Great to be consistent.
Not related to this PR necessarily but I'm going to work on support for converting date strings to timestamps of different resolutions. Right now only Nanos are supported, ideally we'd have to_timestamp(...) that allows choosing nanos, micros, millis, or seconds under the hood.

/// "millis" --> TimestampMillisecondArray
/// "secs" --> TimestampSecondArray
/// "names" --> StringArray
pub fn make_timestamps() -> RecordBatch {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👍 this will be really useful.

@alambalamb changed the title ARROW-12277: [Rust][DataFusion] Implement Sum/Count/Min/Max aggregates for Timestamp(_,_)ARROW-12277: [Rust][DataFusion] Implement and test Count/Min/Max aggregates for Timestamp(_,_)Apr 13, 2021
@alambalamb closed this in 1ed6819Apr 13, 2021
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@alamb@Dandandan@returnString@velvia
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

ARROW-12277: [Rust][DataFusion] Implement and test Count/Min/Max aggregates for Timestamp(_,_) - #9970

Closed
alamb wants to merge 2 commits into
apache:masterfrom
alamb:alamb/ARROW-12277-aggregate-timestamps
Closed

ARROW-12277: [Rust][DataFusion] Implement and test Count/Min/Max aggregates for Timestamp(_,_)#9970
alamb wants to merge 2 commits into
apache:masterfrom
alamb:alamb/ARROW-12277-aggregate-timestamps

Conversation

@alamb

@alambalamb commented Apr 9, 2021

Copy link
Copy Markdown
Contributor

Rationale:

If you try and aggregate (via MIN, for example) a column of a timestamp type, DataFusion generates an error:

Coercion from [Timestamp(Nanosecond, None)] to the signature Uniform(1, [Int8, Int16, Int32, Int64, UInt8, UInt16, UInt32, UInt64, Float32, Float64]) failed.

For example, from IOx

> show columns from t;
+---------------+--------------+------------+-------------+-----------------------------+-------------+
| table_catalog | table_schema | table_name | column_name | data_type | is_nullable |
+---------------+--------------+------------+-------------+-----------------------------+-------------+
| datafusion | public | t | a | Utf8 | NO |
| datafusion | public | t | b | Timestamp(Nanosecond, None) | NO |
+---------------+--------------+------------+-------------+-----------------------------+-------------+
2 row in set. Query took 0 seconds.
> select sum(b) from t;
Plan("Coercion from [Timestamp(Nanosecond, None)] to the signature Uniform(1, [Int8, Int16, Int32, Int64, UInt8, UInt16, UInt32, UInt64, Float32, Float64]) failed.")

Changes:

Add support for aggregating timestamp types and tests for same

Notes

Note this is follow on / more fleshing out of the work done in #9773 by @velvia (👋 thanks for adding Timestamps to ScalarValue)

Supporting AVG on timestamps is tracked by https://issues.apache.org/jira/browse/ARROW-12318. It is more involved (as currently Avg assumes the output type is always F64), and not important for myuse case at the moment.

@github-actions

Copy link
Copy Markdown

Comment threadrust/datafusion/src/scalar.rs Outdated

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I added support for TimestampSecond here and renamed ScalarValue::TimeMillisecond --> ScalarValue::TimestampMillisecond so that the ScalarValue enum type matches up with the DataType enum type name

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👍 Great to be consistent.
Not related to this PR necessarily but I'm going to work on support for converting date strings to timestamps of different resolutions. Right now only Nanos are supported, ideally we'd have to_timestamp(...) that allows choosing nanos, micros, millis, or seconds under the hood.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This error message is pretty horrible. I filed https://issues.apache.org/jira/browse/ARROW-12319 to track improving it

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Agreed, thanks for filing a ticket!

@alamb

Copy link
Copy Markdown
ContributorAuthor

FYI @Dandandan / @returnString

@returnStringreturnString left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'd just hit up against this exact issue this week with some silly SQL clients doing timestamp queries on boot - nice timing! Code looks good to me 👍

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What are the exact use cases for summing timestamps? When does it make sense?
It looks like PostgreSQL doesn't support it: https://www.postgresql.org/docs/13/functions-aggregate.html

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That's a good question. I can think of great uses for avg, and difference (latency between two timestamps), but not really for sum, other than that sum is an important part of computing average?

@Dandandan

Copy link
Copy Markdown
Contributor

Hey @alamb this is looking good.
I'm wondering whether we should support sum/avg for timestamp?

@alamb

Copy link
Copy Markdown
ContributorAuthor

What are the exact use cases for summing timestamps? When does it make sense?

@Dandandan that is an excellent question. I will freely admit I was just heads down trying to get all the aggregates working rather than thinking if I should be working. I can't think of any time that sum(timestamp) really makes sense to be honest.

Do you think I should remove support for summing timestamps?

As for AVG, I added a note to https://issues.apache.org/jira/browse/ARROW-12318 with your observation. 🤔 good question

@Dandandan

Dandandan commented Apr 11, 2021

Copy link
Copy Markdown
Contributor

What are the exact use cases for summing timestamps? When does it make sense?

@Dandandan that is an excellent question. I will freely admit I was just heads down trying to get all the aggregates working rather than thinking if I should be working. I can't think of any time that sum(timestamp) really makes sense to be honest.

Do you think I should remove support for summing timestamps?

As for AVG, I added a note to https://issues.apache.org/jira/browse/ARROW-12318 with your observation. 🤔 good question

At least would be best to remove support for sum, as we don't have an absolute zero for timestamps. For average, I think it may make some more sense, but I think the use case seems limited to me.

@alamb

Copy link
Copy Markdown
ContributorAuthor

At least would be best to remove support for sum, as we don't have an absolute zero for timestamps. For average, I think it may make some more sense, but I think the use case seems limited to me.

will do

@alamb

alamb commented Apr 12, 2021

Copy link
Copy Markdown
ContributorAuthor

At least would be best to remove support for sum, as we don't have an absolute zero for timestamps. For average, I think it may make some more sense, but I think the use case seems limited to me.

@Dandandan -- I just double checked and the IOx project actually has need of Sum (and Avg) for timestamps due to the semantics of the Flux and InfluxQL languages. I can implement this functionality for custom user defined aggregates if needed, but I would prefer having the functionality in DataFusion directly so that anyone else can potentially use it too

I don't really understand the comment about "absolute zero" for timestamps.

Would it be ok with you if I merged in support for Sum for timestamps?

@returnString

returnString commented Apr 12, 2021

Copy link
Copy Markdown
Contributor

Thinking more about this: do we need to be careful about numeric limits? E.g. the current implementation of AvgAccumulator in the physical plan tracks the whole sum and count, and does sum / count at the end, meaning we might hit i64::MAX in the sum component given enough entries in an avg input with a sufficiently high-precision timestamp type.

Edit: don't mind me, it forces an f64 accumulator - I saw ScalarValue and panicked :)

@Dandandan

Dandandan commented Apr 12, 2021

Copy link
Copy Markdown
Contributor

At least would be best to remove support for sum, as we don't have an absolute zero for timestamps. For average, I think it may make some more sense, but I think the use case seems limited to me.

@Dandandan -- I just double checked and the IOx project actually has need of Sum (and Avg) for timestamps due to the semantics of the Flux and InfluxQL languages. I can implement this functionality for custom user defined aggregates if needed, but I would prefer having the functionality in DataFusion directly so that anyone else can potentially use it too

I don't really understand the comment about "absolute zero" for timestamps.

Would it be ok with you if I merged in support for Sum for timestamps?

My reaction to enable sum for timestamps was that it depends on the starting/zero value for the value, in this case the UNIX epoch.
The result of a addition/sum on timestamp is meaningless as it depends on the choice of the value of zero (1980 + 1980 + 1980 = 2000!?, 1970 + 1970 = 1970!?, 1960 + 1960 = 1950!?). When we would change the zero value (to Jan 1 1900 for example), we would totally change the meaning of adding timestamps.

If there was an "actual" zero date (like Kelvin for example) summing the values makes sense but there isn't such a thing for timestamps of course.

@alamb
alambforce-pushed the alamb/ARROW-12277-aggregate-timestamps branch from 31bc7dd to 98e18e3CompareApril 12, 2021 17:09
@alamb

Copy link
Copy Markdown
ContributorAuthor

I have removed SUM from this PR and will figure out what IOx is doing that seems to require sum and doesn't make sense. Thanks @Dandandan

@DandandanDandandan left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks 👍 looks good. Let's see what we should do with sum later 🙂

@velviavelvia left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Great PR @alamb !

.await
.unwrap();

let expected = vec![

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Testing string formatting seems kinda yucky and prone to fail when the formatting changes. Is there a better way to test the output here?

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks @velvia --In general I agree that checking string representations in tests is brittle when formatting changes.

In the case of sql / tabular output, I think it is the best alternative I have seen because:

  1. The output formatting does not change often
  2. Updating these tests are easy (simply copy/paste the output of the test failure into the test after verifying it)
  3. These tests follow the same pattern as the rest of the tests in this module

}

#[tokio::test]
async fn aggregate_timestamps_min() -> Result<()> {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Min and max definitely makes sense.

Comment threadrust/datafusion/src/scalar.rs Outdated

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👍 Great to be consistent.
Not related to this PR necessarily but I'm going to work on support for converting date strings to timestamps of different resolutions. Right now only Nanos are supported, ideally we'd have to_timestamp(...) that allows choosing nanos, micros, millis, or seconds under the hood.

/// "millis" --> TimestampMillisecondArray
/// "secs" --> TimestampSecondArray
/// "names" --> StringArray
pub fn make_timestamps() -> RecordBatch {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👍 this will be really useful.

@alambalamb changed the title ARROW-12277: [Rust][DataFusion] Implement Sum/Count/Min/Max aggregates for Timestamp(_,_)ARROW-12277: [Rust][DataFusion] Implement and test Count/Min/Max aggregates for Timestamp(_,_)Apr 13, 2021
@alambalamb closed this in 1ed6819Apr 13, 2021
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@alamb@Dandandan@returnString@velvia