Skip to content

GH-35515: [C++][Python] Add non decomposable aggregation UDF - #35514

Merged
icexelloss merged 19 commits into
apache:mainfrom
icexelloss:acero-group-agg-UDF-2
Jun 8, 2023
Merged

GH-35515: [C++][Python] Add non decomposable aggregation UDF#35514
icexelloss merged 19 commits into
apache:mainfrom
icexelloss:acero-group-agg-UDF-2

Conversation

@icexelloss

@icexellossicexelloss commented May 9, 2023

Copy link
Copy Markdown
Contributor

Rationale for this change

Non decomposable aggregation is aggregation that cannot be split into consume/merge/finalize. This is often when the logic rewritten with external python libraries (numpy, pandas, statmodels, etc) and those either cannot be decomposed or not worthy the effect (these are often one-off function instead of reusable one). This PR implements the support for non decomposable aggregation UDFs.

The major issue with non decomposable UDF is that the UDF needs to see all data at once, unlike scalar UDF where UDF only needs to see a batch at a time. This makes non decomposable not so useful as it is same as collect all the data to a pd.DataFrame and apply the UDF on it. However, one very application of non decomposable UDF is with segmented aggregation. To refresh, segmented aggregation works on ordered data and passed one logic chunk at a time (e.g., all data with the same date). With segmented aggregation and non decomposable aggregation UDF, the user can apply any custom aggregation logic over large stream of ordered data, with the memory overhead of a single segment.

What changes are included in this PR?

This PR is currently WIP and not ready for review.

So far I have implemented the minimal amount of code to make a basic test working but needs clean up, error handling etc.

  • First round of self review
  • Second round of self review
  • Implement and test unary
  • Implement and test varargs
  • Implement and test Acero support with segmented aggregation

Are these changes tested?

Added new test calling with compute and acero.

The compute tests calls the aggregation on the full array. The acero test callings the aggregation with segmented aggregation.

Are there any user-facing changes?

@icexelloss
icexelloss requested a review from AlenkaF as a code ownerMay 9, 2023 15:16
@github-actions

Copy link
Copy Markdown

Thanks for opening a pull request!

If this is not a minor PR. Could you open an issue for this pull request on GitHub? https://github.com/apache/arrow/issues/new/choose

Opening GitHub issues ahead of time contributes to the Openness of the Apache Arrow project.

Then could you also rename the pull request title in the following format?

GH-${GITHUB_ISSUE_ID}: [${COMPONENT}] ${SUMMARY}

or

MINOR: [${COMPONENT}] ${SUMMARY}

In the case of PARQUET issues on JIRA the title also supports:

PARQUET-${JIRA_ISSUE_ID}: [${COMPONENT}] ${SUMMARY}

See also:

@icexellossicexelloss changed the title WIP: [C++][Python] Add non decomposable aggregation UDFGH-35515: [WIP][C++][Python] Add non decomposable aggregation UDFMay 9, 2023
@github-actions

Copy link
Copy Markdown

@github-actions

Copy link
Copy Markdown

⚠️ GitHub issue #35515has been automatically assigned in GitHub to PR creator.

@github-actionsgithub-actionsBot added the awaiting committer review Awaiting committer review label May 9, 2023
@icexelloss
icexellossforce-pushed the acero-group-agg-UDF-2 branch 2 times, most recently from 0dd8e25 to 2b38a2fCompareMay 9, 2023 15:31

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.

"Scalar" as supposed to the "grouped" aggregator which has difference interface:
https://github.com/apache/arrow/blob/main/cpp/src/arrow/compute/kernels/hash_aggregate.cc#L66

@github-actionsgithub-actionsBot added awaiting changes Awaiting changes awaiting change review Awaiting change review and removed awaiting committer review Awaiting committer review awaiting changes Awaiting changes labels May 9, 2023
Comment threadpython/pyarrow/tests/test_udf.py Outdated
Comment threadpython/pyarrow/src/arrow/python/udf.cc Outdated
@github-actionsgithub-actionsBot added awaiting changes Awaiting changes awaiting change review Awaiting change review and removed awaiting change review Awaiting change review awaiting changes Awaiting changes labels May 9, 2023
Comment threadpython/pyarrow/src/arrow/python/udf.cc Outdated
@github-actionsgithub-actionsBot added awaiting changes Awaiting changes and removed awaiting change review Awaiting change review labels May 15, 2023
@github-actionsgithub-actionsBot added Component: C++ awaiting change review Awaiting change review and removed awaiting changes Awaiting changes labels May 15, 2023
Comment threadcpp/src/arrow/engine/substrait/extension_set.cc Outdated
@github-actionsgithub-actionsBot added awaiting change review Awaiting change review and removed awaiting changes Awaiting changes labels Jun 5, 2023
@icexelloss
icexellossforce-pushed the acero-group-agg-UDF-2 branch from 7ba9cc8 to 1203346CompareJune 6, 2023 15:39
@icexelloss
icexellossforce-pushed the acero-group-agg-UDF-2 branch from 6044f20 to 17ff274CompareJune 6, 2023 21:53
@icexelloss

Copy link
Copy Markdown
ContributorAuthor

@westonpace I believe this PR is good to go. The failed CI seems unrelated. I have checked the Py refcount and it seems OK (I will add details in the comment thread above)

@github-actionsgithub-actionsBot added awaiting changes Awaiting changes and removed awaiting change review Awaiting change review labels Jun 7, 2023
@westonpace

Copy link
Copy Markdown
Member

@icexelloss I'll take another look through today.

@icexelloss

Copy link
Copy Markdown
ContributorAuthor

@icexelloss I'll take another look through today.

Thank you!

@westonpacewestonpace left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

A few more very minor suggestions but, overall, I think this is fine.

Comment threadpython/pyarrow/_compute.pyx Outdated
Comment threadpython/pyarrow/src/arrow/python/udf.cc Outdated
Comment threadpython/pyarrow/src/arrow/python/udf.cc Outdated
Comment threadpython/pyarrow/conftest.py Outdated
Comment on lines 331 to 332

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Ok, so the test case is verifying that the python function can take in *args if needed (even though it still lists the args when registering)?

std::vector<std::shared_ptr<DataType>> input_types,
std::shared_ptr<DataType> output_type)
: agg_cb(agg_cb), agg_function(agg_function), output_type(output_type) {
Py_INCREF(agg_function->obj());

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

This increment seems redundant given you already have one 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.

Admitted there could be some redundancy here. I created an follow up to take a closer look:

#36000

Comment threadpython/pyarrow/src/arrow/python/udf.cc Outdated
Comment threadpython/pyarrow/src/arrow/python/udf.cc Outdated
Comment threadpython/pyarrow/src/arrow/python/udf.cc Outdated
Comment threadpython/pyarrow/src/arrow/python/udf.cc Outdated
Comment threadpython/pyarrow/src/arrow/python/udf.cc Outdated
@github-actionsgithub-actionsBot added awaiting merge Awaiting merge awaiting changes Awaiting changes and removed awaiting changes Awaiting changes awaiting merge Awaiting merge labels Jun 8, 2023
Co-authored-by: Weston Pace <weston.pace@gmail.com>
@github-actionsgithub-actionsBot added awaiting change review Awaiting change review and removed awaiting changes Awaiting changes labels Jun 8, 2023
@icexelloss

Copy link
Copy Markdown
ContributorAuthor

I checked failed CI jobs and those seem unrelated.

@icexelloss
icexelloss merged commit 8b5919d into apache:mainJun 8, 2023
@github-actionsgithub-actionsBot added awaiting changes Awaiting changes and removed awaiting change review Awaiting change review labels Jun 8, 2023
@ursabot

Copy link
Copy Markdown

Benchmark runs are scheduled for baseline = e920bed and contender = 8b5919d. 8b5919d is a master commit associated with this PR. Results will be available as each benchmark for each run completes.
Conbench compare runs links:
[Finished ⬇️0.0% ⬆️0.0%] ec2-t3-xlarge-us-east-2
[Finished ⬇️1.15% ⬆️0.06%] test-mac-arm
[Finished ⬇️10.46% ⬆️6.21%] ursa-i9-9960x
[Finished ⬇️0.3% ⬆️0.0%] ursa-thinkcentre-m75q
Buildkite builds:
[Finished] 8b5919d8 ec2-t3-xlarge-us-east-2
[Finished] 8b5919d8 test-mac-arm
[Finished] 8b5919d8 ursa-i9-9960x
[Finished] 8b5919d8 ursa-thinkcentre-m75q
[Finished] e920bed4 ec2-t3-xlarge-us-east-2
[Finished] e920bed4 test-mac-arm
[Finished] e920bed4 ursa-i9-9960x
[Finished] e920bed4 ursa-thinkcentre-m75q
Supported benchmarks:
ec2-t3-xlarge-us-east-2: Supported benchmark langs: Python, R. Runs only benchmarks with cloud = True
test-mac-arm: Supported benchmark langs: C++, Python, R
ursa-i9-9960x: Supported benchmark langs: Python, R, JavaScript
ursa-thinkcentre-m75q: Supported benchmark langs: C++, Java

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.

[C++][Python] Non decomposable aggregation UDF

4 participants

@icexelloss@westonpace@ursabot@felipecrv
, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
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;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
GH-35515: [C++][Python] Add non decomposable aggregation UDF by icexelloss · Pull Request #35514 · apache/arrow · GitHub
Skip to content

GH-35515: [C++][Python] Add non decomposable aggregation UDF - #35514

Merged
icexelloss merged 19 commits into
apache:mainfrom
icexelloss:acero-group-agg-UDF-2
Jun 8, 2023
Merged

GH-35515: [C++][Python] Add non decomposable aggregation UDF#35514
icexelloss merged 19 commits into
apache:mainfrom
icexelloss:acero-group-agg-UDF-2

Conversation

@icexelloss

@icexellossicexelloss commented May 9, 2023

Copy link
Copy Markdown
Contributor

Rationale for this change

Non decomposable aggregation is aggregation that cannot be split into consume/merge/finalize. This is often when the logic rewritten with external python libraries (numpy, pandas, statmodels, etc) and those either cannot be decomposed or not worthy the effect (these are often one-off function instead of reusable one). This PR implements the support for non decomposable aggregation UDFs.

The major issue with non decomposable UDF is that the UDF needs to see all data at once, unlike scalar UDF where UDF only needs to see a batch at a time. This makes non decomposable not so useful as it is same as collect all the data to a pd.DataFrame and apply the UDF on it. However, one very application of non decomposable UDF is with segmented aggregation. To refresh, segmented aggregation works on ordered data and passed one logic chunk at a time (e.g., all data with the same date). With segmented aggregation and non decomposable aggregation UDF, the user can apply any custom aggregation logic over large stream of ordered data, with the memory overhead of a single segment.

What changes are included in this PR?

This PR is currently WIP and not ready for review.

So far I have implemented the minimal amount of code to make a basic test working but needs clean up, error handling etc.

  • First round of self review
  • Second round of self review
  • Implement and test unary
  • Implement and test varargs
  • Implement and test Acero support with segmented aggregation

Are these changes tested?

Added new test calling with compute and acero.

The compute tests calls the aggregation on the full array. The acero test callings the aggregation with segmented aggregation.

Are there any user-facing changes?

@icexelloss
icexelloss requested a review from AlenkaF as a code ownerMay 9, 2023 15:16
@github-actions

Copy link
Copy Markdown

Thanks for opening a pull request!

If this is not a minor PR. Could you open an issue for this pull request on GitHub? https://github.com/apache/arrow/issues/new/choose

Opening GitHub issues ahead of time contributes to the Openness of the Apache Arrow project.

Then could you also rename the pull request title in the following format?

GH-${GITHUB_ISSUE_ID}: [${COMPONENT}] ${SUMMARY}

or

MINOR: [${COMPONENT}] ${SUMMARY}

In the case of PARQUET issues on JIRA the title also supports:

PARQUET-${JIRA_ISSUE_ID}: [${COMPONENT}] ${SUMMARY}

See also:

@icexellossicexelloss changed the title WIP: [C++][Python] Add non decomposable aggregation UDFGH-35515: [WIP][C++][Python] Add non decomposable aggregation UDFMay 9, 2023
@github-actions

Copy link
Copy Markdown

@github-actions

Copy link
Copy Markdown

⚠️ GitHub issue #35515has been automatically assigned in GitHub to PR creator.

@github-actionsgithub-actionsBot added the awaiting committer review Awaiting committer review label May 9, 2023
@icexelloss
icexellossforce-pushed the acero-group-agg-UDF-2 branch 2 times, most recently from 0dd8e25 to 2b38a2fCompareMay 9, 2023 15:31

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.

"Scalar" as supposed to the "grouped" aggregator which has difference interface:
https://github.com/apache/arrow/blob/main/cpp/src/arrow/compute/kernels/hash_aggregate.cc#L66

@github-actionsgithub-actionsBot added awaiting changes Awaiting changes awaiting change review Awaiting change review and removed awaiting committer review Awaiting committer review awaiting changes Awaiting changes labels May 9, 2023
Comment threadpython/pyarrow/tests/test_udf.py Outdated
Comment threadpython/pyarrow/src/arrow/python/udf.cc Outdated
@github-actionsgithub-actionsBot added awaiting changes Awaiting changes awaiting change review Awaiting change review and removed awaiting change review Awaiting change review awaiting changes Awaiting changes labels May 9, 2023
Comment threadpython/pyarrow/src/arrow/python/udf.cc Outdated
@github-actionsgithub-actionsBot added awaiting changes Awaiting changes and removed awaiting change review Awaiting change review labels May 15, 2023
@github-actionsgithub-actionsBot added Component: C++ awaiting change review Awaiting change review and removed awaiting changes Awaiting changes labels May 15, 2023
Comment threadcpp/src/arrow/engine/substrait/extension_set.cc Outdated
@github-actionsgithub-actionsBot added awaiting change review Awaiting change review and removed awaiting changes Awaiting changes labels Jun 5, 2023
@icexelloss
icexellossforce-pushed the acero-group-agg-UDF-2 branch from 7ba9cc8 to 1203346CompareJune 6, 2023 15:39
@icexelloss
icexellossforce-pushed the acero-group-agg-UDF-2 branch from 6044f20 to 17ff274CompareJune 6, 2023 21:53
@icexelloss

Copy link
Copy Markdown
ContributorAuthor

@westonpace I believe this PR is good to go. The failed CI seems unrelated. I have checked the Py refcount and it seems OK (I will add details in the comment thread above)

@github-actionsgithub-actionsBot added awaiting changes Awaiting changes and removed awaiting change review Awaiting change review labels Jun 7, 2023
@westonpace

Copy link
Copy Markdown
Member

@icexelloss I'll take another look through today.

@icexelloss

Copy link
Copy Markdown
ContributorAuthor

@icexelloss I'll take another look through today.

Thank you!

@westonpacewestonpace left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

A few more very minor suggestions but, overall, I think this is fine.

Comment threadpython/pyarrow/_compute.pyx Outdated
Comment threadpython/pyarrow/src/arrow/python/udf.cc Outdated
Comment threadpython/pyarrow/src/arrow/python/udf.cc Outdated
Comment threadpython/pyarrow/conftest.py Outdated
Comment on lines 331 to 332

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Ok, so the test case is verifying that the python function can take in *args if needed (even though it still lists the args when registering)?

std::vector<std::shared_ptr<DataType>> input_types,
std::shared_ptr<DataType> output_type)
: agg_cb(agg_cb), agg_function(agg_function), output_type(output_type) {
Py_INCREF(agg_function->obj());

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

This increment seems redundant given you already have one 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.

Admitted there could be some redundancy here. I created an follow up to take a closer look:

#36000

Comment threadpython/pyarrow/src/arrow/python/udf.cc Outdated
Comment threadpython/pyarrow/src/arrow/python/udf.cc Outdated
Comment threadpython/pyarrow/src/arrow/python/udf.cc Outdated
Comment threadpython/pyarrow/src/arrow/python/udf.cc Outdated
Comment threadpython/pyarrow/src/arrow/python/udf.cc Outdated
@github-actionsgithub-actionsBot added awaiting merge Awaiting merge awaiting changes Awaiting changes and removed awaiting changes Awaiting changes awaiting merge Awaiting merge labels Jun 8, 2023
Co-authored-by: Weston Pace <weston.pace@gmail.com>
@github-actionsgithub-actionsBot added awaiting change review Awaiting change review and removed awaiting changes Awaiting changes labels Jun 8, 2023
@icexelloss

Copy link
Copy Markdown
ContributorAuthor

I checked failed CI jobs and those seem unrelated.

@icexelloss
icexelloss merged commit 8b5919d into apache:mainJun 8, 2023
@github-actionsgithub-actionsBot added awaiting changes Awaiting changes and removed awaiting change review Awaiting change review labels Jun 8, 2023
@ursabot

Copy link
Copy Markdown

Benchmark runs are scheduled for baseline = e920bed and contender = 8b5919d. 8b5919d is a master commit associated with this PR. Results will be available as each benchmark for each run completes.
Conbench compare runs links:
[Finished ⬇️0.0% ⬆️0.0%] ec2-t3-xlarge-us-east-2
[Finished ⬇️1.15% ⬆️0.06%] test-mac-arm
[Finished ⬇️10.46% ⬆️6.21%] ursa-i9-9960x
[Finished ⬇️0.3% ⬆️0.0%] ursa-thinkcentre-m75q
Buildkite builds:
[Finished] 8b5919d8 ec2-t3-xlarge-us-east-2
[Finished] 8b5919d8 test-mac-arm
[Finished] 8b5919d8 ursa-i9-9960x
[Finished] 8b5919d8 ursa-thinkcentre-m75q
[Finished] e920bed4 ec2-t3-xlarge-us-east-2
[Finished] e920bed4 test-mac-arm
[Finished] e920bed4 ursa-i9-9960x
[Finished] e920bed4 ursa-thinkcentre-m75q
Supported benchmarks:
ec2-t3-xlarge-us-east-2: Supported benchmark langs: Python, R. Runs only benchmarks with cloud = True
test-mac-arm: Supported benchmark langs: C++, Python, R
ursa-i9-9960x: Supported benchmark langs: Python, R, JavaScript
ursa-thinkcentre-m75q: Supported benchmark langs: C++, Java

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.

[C++][Python] Non decomposable aggregation UDF

4 participants

@icexelloss@westonpace@ursabot@felipecrv
, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GH-35515: [C++][Python] Add non decomposable aggregation UDF by icexelloss · Pull Request #35514 · apache/arrow · GitHub
Skip to content

GH-35515: [C++][Python] Add non decomposable aggregation UDF - #35514

Merged
icexelloss merged 19 commits into
apache:mainfrom
icexelloss:acero-group-agg-UDF-2
Jun 8, 2023
Merged

GH-35515: [C++][Python] Add non decomposable aggregation UDF#35514
icexelloss merged 19 commits into
apache:mainfrom
icexelloss:acero-group-agg-UDF-2

Conversation

@icexelloss

@icexellossicexelloss commented May 9, 2023

Copy link
Copy Markdown
Contributor

Rationale for this change

Non decomposable aggregation is aggregation that cannot be split into consume/merge/finalize. This is often when the logic rewritten with external python libraries (numpy, pandas, statmodels, etc) and those either cannot be decomposed or not worthy the effect (these are often one-off function instead of reusable one). This PR implements the support for non decomposable aggregation UDFs.

The major issue with non decomposable UDF is that the UDF needs to see all data at once, unlike scalar UDF where UDF only needs to see a batch at a time. This makes non decomposable not so useful as it is same as collect all the data to a pd.DataFrame and apply the UDF on it. However, one very application of non decomposable UDF is with segmented aggregation. To refresh, segmented aggregation works on ordered data and passed one logic chunk at a time (e.g., all data with the same date). With segmented aggregation and non decomposable aggregation UDF, the user can apply any custom aggregation logic over large stream of ordered data, with the memory overhead of a single segment.

What changes are included in this PR?

This PR is currently WIP and not ready for review.

So far I have implemented the minimal amount of code to make a basic test working but needs clean up, error handling etc.

  • First round of self review
  • Second round of self review
  • Implement and test unary
  • Implement and test varargs
  • Implement and test Acero support with segmented aggregation

Are these changes tested?

Added new test calling with compute and acero.

The compute tests calls the aggregation on the full array. The acero test callings the aggregation with segmented aggregation.

Are there any user-facing changes?

@icexelloss
icexelloss requested a review from AlenkaF as a code ownerMay 9, 2023 15:16
@github-actions

Copy link
Copy Markdown

Thanks for opening a pull request!

If this is not a minor PR. Could you open an issue for this pull request on GitHub? https://github.com/apache/arrow/issues/new/choose

Opening GitHub issues ahead of time contributes to the Openness of the Apache Arrow project.

Then could you also rename the pull request title in the following format?

GH-${GITHUB_ISSUE_ID}: [${COMPONENT}] ${SUMMARY}

or

MINOR: [${COMPONENT}] ${SUMMARY}

In the case of PARQUET issues on JIRA the title also supports:

PARQUET-${JIRA_ISSUE_ID}: [${COMPONENT}] ${SUMMARY}

See also:

@icexellossicexelloss changed the title WIP: [C++][Python] Add non decomposable aggregation UDFGH-35515: [WIP][C++][Python] Add non decomposable aggregation UDFMay 9, 2023
@github-actions

Copy link
Copy Markdown

@github-actions

Copy link
Copy Markdown

⚠️ GitHub issue #35515has been automatically assigned in GitHub to PR creator.

@github-actionsgithub-actionsBot added the awaiting committer review Awaiting committer review label May 9, 2023
@icexelloss
icexellossforce-pushed the acero-group-agg-UDF-2 branch 2 times, most recently from 0dd8e25 to 2b38a2fCompareMay 9, 2023 15:31

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.

"Scalar" as supposed to the "grouped" aggregator which has difference interface:
https://github.com/apache/arrow/blob/main/cpp/src/arrow/compute/kernels/hash_aggregate.cc#L66

@github-actionsgithub-actionsBot added awaiting changes Awaiting changes awaiting change review Awaiting change review and removed awaiting committer review Awaiting committer review awaiting changes Awaiting changes labels May 9, 2023
Comment threadpython/pyarrow/tests/test_udf.py Outdated
Comment threadpython/pyarrow/src/arrow/python/udf.cc Outdated
@github-actionsgithub-actionsBot added awaiting changes Awaiting changes awaiting change review Awaiting change review and removed awaiting change review Awaiting change review awaiting changes Awaiting changes labels May 9, 2023
Comment threadpython/pyarrow/src/arrow/python/udf.cc Outdated
@github-actionsgithub-actionsBot added awaiting changes Awaiting changes and removed awaiting change review Awaiting change review labels May 15, 2023
@github-actionsgithub-actionsBot added Component: C++ awaiting change review Awaiting change review and removed awaiting changes Awaiting changes labels May 15, 2023
Comment threadcpp/src/arrow/engine/substrait/extension_set.cc Outdated
@github-actionsgithub-actionsBot added awaiting change review Awaiting change review and removed awaiting changes Awaiting changes labels Jun 5, 2023
@icexelloss
icexellossforce-pushed the acero-group-agg-UDF-2 branch from 7ba9cc8 to 1203346CompareJune 6, 2023 15:39
@icexelloss
icexellossforce-pushed the acero-group-agg-UDF-2 branch from 6044f20 to 17ff274CompareJune 6, 2023 21:53
@icexelloss

Copy link
Copy Markdown
ContributorAuthor

@westonpace I believe this PR is good to go. The failed CI seems unrelated. I have checked the Py refcount and it seems OK (I will add details in the comment thread above)

@github-actionsgithub-actionsBot added awaiting changes Awaiting changes and removed awaiting change review Awaiting change review labels Jun 7, 2023
@westonpace

Copy link
Copy Markdown
Member

@icexelloss I'll take another look through today.

@icexelloss

Copy link
Copy Markdown
ContributorAuthor

@icexelloss I'll take another look through today.

Thank you!

@westonpacewestonpace left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

A few more very minor suggestions but, overall, I think this is fine.

Comment threadpython/pyarrow/_compute.pyx Outdated
Comment threadpython/pyarrow/src/arrow/python/udf.cc Outdated
Comment threadpython/pyarrow/src/arrow/python/udf.cc Outdated
Comment threadpython/pyarrow/conftest.py Outdated
Comment on lines 331 to 332

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Ok, so the test case is verifying that the python function can take in *args if needed (even though it still lists the args when registering)?

std::vector<std::shared_ptr<DataType>> input_types,
std::shared_ptr<DataType> output_type)
: agg_cb(agg_cb), agg_function(agg_function), output_type(output_type) {
Py_INCREF(agg_function->obj());

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

This increment seems redundant given you already have one 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.

Admitted there could be some redundancy here. I created an follow up to take a closer look:

#36000

Comment threadpython/pyarrow/src/arrow/python/udf.cc Outdated
Comment threadpython/pyarrow/src/arrow/python/udf.cc Outdated
Comment threadpython/pyarrow/src/arrow/python/udf.cc Outdated
Comment threadpython/pyarrow/src/arrow/python/udf.cc Outdated
Comment threadpython/pyarrow/src/arrow/python/udf.cc Outdated
@github-actionsgithub-actionsBot added awaiting merge Awaiting merge awaiting changes Awaiting changes and removed awaiting changes Awaiting changes awaiting merge Awaiting merge labels Jun 8, 2023
Co-authored-by: Weston Pace <weston.pace@gmail.com>
@github-actionsgithub-actionsBot added awaiting change review Awaiting change review and removed awaiting changes Awaiting changes labels Jun 8, 2023
@icexelloss

Copy link
Copy Markdown
ContributorAuthor

I checked failed CI jobs and those seem unrelated.

@icexelloss
icexelloss merged commit 8b5919d into apache:mainJun 8, 2023
@github-actionsgithub-actionsBot added awaiting changes Awaiting changes and removed awaiting change review Awaiting change review labels Jun 8, 2023
@ursabot

Copy link
Copy Markdown

Benchmark runs are scheduled for baseline = e920bed and contender = 8b5919d. 8b5919d is a master commit associated with this PR. Results will be available as each benchmark for each run completes.
Conbench compare runs links:
[Finished ⬇️0.0% ⬆️0.0%] ec2-t3-xlarge-us-east-2
[Finished ⬇️1.15% ⬆️0.06%] test-mac-arm
[Finished ⬇️10.46% ⬆️6.21%] ursa-i9-9960x
[Finished ⬇️0.3% ⬆️0.0%] ursa-thinkcentre-m75q
Buildkite builds:
[Finished] 8b5919d8 ec2-t3-xlarge-us-east-2
[Finished] 8b5919d8 test-mac-arm
[Finished] 8b5919d8 ursa-i9-9960x
[Finished] 8b5919d8 ursa-thinkcentre-m75q
[Finished] e920bed4 ec2-t3-xlarge-us-east-2
[Finished] e920bed4 test-mac-arm
[Finished] e920bed4 ursa-i9-9960x
[Finished] e920bed4 ursa-thinkcentre-m75q
Supported benchmarks:
ec2-t3-xlarge-us-east-2: Supported benchmark langs: Python, R. Runs only benchmarks with cloud = True
test-mac-arm: Supported benchmark langs: C++, Python, R
ursa-i9-9960x: Supported benchmark langs: Python, R, JavaScript
ursa-thinkcentre-m75q: Supported benchmark langs: C++, Java

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.

[C++][Python] Non decomposable aggregation UDF

4 participants

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

GH-35515: [C++][Python] Add non decomposable aggregation UDF - #35514

Merged
icexelloss merged 19 commits into
apache:mainfrom
icexelloss:acero-group-agg-UDF-2
Jun 8, 2023
Merged

GH-35515: [C++][Python] Add non decomposable aggregation UDF#35514
icexelloss merged 19 commits into
apache:mainfrom
icexelloss:acero-group-agg-UDF-2

Conversation

@icexelloss

@icexellossicexelloss commented May 9, 2023

Copy link
Copy Markdown
Contributor

Rationale for this change

Non decomposable aggregation is aggregation that cannot be split into consume/merge/finalize. This is often when the logic rewritten with external python libraries (numpy, pandas, statmodels, etc) and those either cannot be decomposed or not worthy the effect (these are often one-off function instead of reusable one). This PR implements the support for non decomposable aggregation UDFs.

The major issue with non decomposable UDF is that the UDF needs to see all data at once, unlike scalar UDF where UDF only needs to see a batch at a time. This makes non decomposable not so useful as it is same as collect all the data to a pd.DataFrame and apply the UDF on it. However, one very application of non decomposable UDF is with segmented aggregation. To refresh, segmented aggregation works on ordered data and passed one logic chunk at a time (e.g., all data with the same date). With segmented aggregation and non decomposable aggregation UDF, the user can apply any custom aggregation logic over large stream of ordered data, with the memory overhead of a single segment.

What changes are included in this PR?

This PR is currently WIP and not ready for review.

So far I have implemented the minimal amount of code to make a basic test working but needs clean up, error handling etc.

  • First round of self review
  • Second round of self review
  • Implement and test unary
  • Implement and test varargs
  • Implement and test Acero support with segmented aggregation

Are these changes tested?

Added new test calling with compute and acero.

The compute tests calls the aggregation on the full array. The acero test callings the aggregation with segmented aggregation.

Are there any user-facing changes?

@icexelloss
icexelloss requested a review from AlenkaF as a code ownerMay 9, 2023 15:16
@github-actions

Copy link
Copy Markdown

Thanks for opening a pull request!

If this is not a minor PR. Could you open an issue for this pull request on GitHub? https://github.com/apache/arrow/issues/new/choose

Opening GitHub issues ahead of time contributes to the Openness of the Apache Arrow project.

Then could you also rename the pull request title in the following format?

GH-${GITHUB_ISSUE_ID}: [${COMPONENT}] ${SUMMARY}

or

MINOR: [${COMPONENT}] ${SUMMARY}

In the case of PARQUET issues on JIRA the title also supports:

PARQUET-${JIRA_ISSUE_ID}: [${COMPONENT}] ${SUMMARY}

See also:

@icexellossicexelloss changed the title WIP: [C++][Python] Add non decomposable aggregation UDFGH-35515: [WIP][C++][Python] Add non decomposable aggregation UDFMay 9, 2023
@github-actions

Copy link
Copy Markdown

@github-actions

Copy link
Copy Markdown

⚠️ GitHub issue #35515has been automatically assigned in GitHub to PR creator.

@github-actionsgithub-actionsBot added the awaiting committer review Awaiting committer review label May 9, 2023
@icexelloss
icexellossforce-pushed the acero-group-agg-UDF-2 branch 2 times, most recently from 0dd8e25 to 2b38a2fCompareMay 9, 2023 15:31

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.

"Scalar" as supposed to the "grouped" aggregator which has difference interface:
https://github.com/apache/arrow/blob/main/cpp/src/arrow/compute/kernels/hash_aggregate.cc#L66

@github-actionsgithub-actionsBot added awaiting changes Awaiting changes awaiting change review Awaiting change review and removed awaiting committer review Awaiting committer review awaiting changes Awaiting changes labels May 9, 2023
Comment threadpython/pyarrow/tests/test_udf.py Outdated
Comment threadpython/pyarrow/src/arrow/python/udf.cc Outdated
@github-actionsgithub-actionsBot added awaiting changes Awaiting changes awaiting change review Awaiting change review and removed awaiting change review Awaiting change review awaiting changes Awaiting changes labels May 9, 2023
Comment threadpython/pyarrow/src/arrow/python/udf.cc Outdated
@github-actionsgithub-actionsBot added awaiting changes Awaiting changes and removed awaiting change review Awaiting change review labels May 15, 2023
@github-actionsgithub-actionsBot added Component: C++ awaiting change review Awaiting change review and removed awaiting changes Awaiting changes labels May 15, 2023
Comment threadcpp/src/arrow/engine/substrait/extension_set.cc Outdated
@github-actionsgithub-actionsBot added awaiting change review Awaiting change review and removed awaiting changes Awaiting changes labels Jun 5, 2023
@icexelloss
icexellossforce-pushed the acero-group-agg-UDF-2 branch from 7ba9cc8 to 1203346CompareJune 6, 2023 15:39
@icexelloss
icexellossforce-pushed the acero-group-agg-UDF-2 branch from 6044f20 to 17ff274CompareJune 6, 2023 21:53
@icexelloss

Copy link
Copy Markdown
ContributorAuthor

@westonpace I believe this PR is good to go. The failed CI seems unrelated. I have checked the Py refcount and it seems OK (I will add details in the comment thread above)

@github-actionsgithub-actionsBot added awaiting changes Awaiting changes and removed awaiting change review Awaiting change review labels Jun 7, 2023
@westonpace

Copy link
Copy Markdown
Member

@icexelloss I'll take another look through today.

@icexelloss

Copy link
Copy Markdown
ContributorAuthor

@icexelloss I'll take another look through today.

Thank you!

@westonpacewestonpace left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

A few more very minor suggestions but, overall, I think this is fine.

Comment threadpython/pyarrow/_compute.pyx Outdated
Comment threadpython/pyarrow/src/arrow/python/udf.cc Outdated
Comment threadpython/pyarrow/src/arrow/python/udf.cc Outdated
Comment threadpython/pyarrow/conftest.py Outdated
Comment on lines 331 to 332

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Ok, so the test case is verifying that the python function can take in *args if needed (even though it still lists the args when registering)?

std::vector<std::shared_ptr<DataType>> input_types,
std::shared_ptr<DataType> output_type)
: agg_cb(agg_cb), agg_function(agg_function), output_type(output_type) {
Py_INCREF(agg_function->obj());

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

This increment seems redundant given you already have one 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.

Admitted there could be some redundancy here. I created an follow up to take a closer look:

#36000

Comment threadpython/pyarrow/src/arrow/python/udf.cc Outdated
Comment threadpython/pyarrow/src/arrow/python/udf.cc Outdated
Comment threadpython/pyarrow/src/arrow/python/udf.cc Outdated
Comment threadpython/pyarrow/src/arrow/python/udf.cc Outdated
Comment threadpython/pyarrow/src/arrow/python/udf.cc Outdated
@github-actionsgithub-actionsBot added awaiting merge Awaiting merge awaiting changes Awaiting changes and removed awaiting changes Awaiting changes awaiting merge Awaiting merge labels Jun 8, 2023
Co-authored-by: Weston Pace <weston.pace@gmail.com>
@github-actionsgithub-actionsBot added awaiting change review Awaiting change review and removed awaiting changes Awaiting changes labels Jun 8, 2023
@icexelloss

Copy link
Copy Markdown
ContributorAuthor

I checked failed CI jobs and those seem unrelated.

@icexelloss
icexelloss merged commit 8b5919d into apache:mainJun 8, 2023
@github-actionsgithub-actionsBot added awaiting changes Awaiting changes and removed awaiting change review Awaiting change review labels Jun 8, 2023
@ursabot

Copy link
Copy Markdown

Benchmark runs are scheduled for baseline = e920bed and contender = 8b5919d. 8b5919d is a master commit associated with this PR. Results will be available as each benchmark for each run completes.
Conbench compare runs links:
[Finished ⬇️0.0% ⬆️0.0%] ec2-t3-xlarge-us-east-2
[Finished ⬇️1.15% ⬆️0.06%] test-mac-arm
[Finished ⬇️10.46% ⬆️6.21%] ursa-i9-9960x
[Finished ⬇️0.3% ⬆️0.0%] ursa-thinkcentre-m75q
Buildkite builds:
[Finished] 8b5919d8 ec2-t3-xlarge-us-east-2
[Finished] 8b5919d8 test-mac-arm
[Finished] 8b5919d8 ursa-i9-9960x
[Finished] 8b5919d8 ursa-thinkcentre-m75q
[Finished] e920bed4 ec2-t3-xlarge-us-east-2
[Finished] e920bed4 test-mac-arm
[Finished] e920bed4 ursa-i9-9960x
[Finished] e920bed4 ursa-thinkcentre-m75q
Supported benchmarks:
ec2-t3-xlarge-us-east-2: Supported benchmark langs: Python, R. Runs only benchmarks with cloud = True
test-mac-arm: Supported benchmark langs: C++, Python, R
ursa-i9-9960x: Supported benchmark langs: Python, R, JavaScript
ursa-thinkcentre-m75q: Supported benchmark langs: C++, Java

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.

[C++][Python] Non decomposable aggregation UDF

4 participants

@icexelloss@westonpace@ursabot@felipecrv
, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' GH-35515: [C++][Python] Add non decomposable aggregation UDF by icexelloss · Pull Request #35514 · apache/arrow · GitHub
Skip to content

GH-35515: [C++][Python] Add non decomposable aggregation UDF - #35514

Merged
icexelloss merged 19 commits into
apache:mainfrom
icexelloss:acero-group-agg-UDF-2
Jun 8, 2023
Merged

GH-35515: [C++][Python] Add non decomposable aggregation UDF#35514
icexelloss merged 19 commits into
apache:mainfrom
icexelloss:acero-group-agg-UDF-2

Conversation

@icexelloss

@icexellossicexelloss commented May 9, 2023

Copy link
Copy Markdown
Contributor

Rationale for this change

Non decomposable aggregation is aggregation that cannot be split into consume/merge/finalize. This is often when the logic rewritten with external python libraries (numpy, pandas, statmodels, etc) and those either cannot be decomposed or not worthy the effect (these are often one-off function instead of reusable one). This PR implements the support for non decomposable aggregation UDFs.

The major issue with non decomposable UDF is that the UDF needs to see all data at once, unlike scalar UDF where UDF only needs to see a batch at a time. This makes non decomposable not so useful as it is same as collect all the data to a pd.DataFrame and apply the UDF on it. However, one very application of non decomposable UDF is with segmented aggregation. To refresh, segmented aggregation works on ordered data and passed one logic chunk at a time (e.g., all data with the same date). With segmented aggregation and non decomposable aggregation UDF, the user can apply any custom aggregation logic over large stream of ordered data, with the memory overhead of a single segment.

What changes are included in this PR?

This PR is currently WIP and not ready for review.

So far I have implemented the minimal amount of code to make a basic test working but needs clean up, error handling etc.

  • First round of self review
  • Second round of self review
  • Implement and test unary
  • Implement and test varargs
  • Implement and test Acero support with segmented aggregation

Are these changes tested?

Added new test calling with compute and acero.

The compute tests calls the aggregation on the full array. The acero test callings the aggregation with segmented aggregation.

Are there any user-facing changes?

@icexelloss
icexelloss requested a review from AlenkaF as a code ownerMay 9, 2023 15:16
@github-actions

Copy link
Copy Markdown

Thanks for opening a pull request!

If this is not a minor PR. Could you open an issue for this pull request on GitHub? https://github.com/apache/arrow/issues/new/choose

Opening GitHub issues ahead of time contributes to the Openness of the Apache Arrow project.

Then could you also rename the pull request title in the following format?

GH-${GITHUB_ISSUE_ID}: [${COMPONENT}] ${SUMMARY}

or

MINOR: [${COMPONENT}] ${SUMMARY}

In the case of PARQUET issues on JIRA the title also supports:

PARQUET-${JIRA_ISSUE_ID}: [${COMPONENT}] ${SUMMARY}

See also:

@icexellossicexelloss changed the title WIP: [C++][Python] Add non decomposable aggregation UDFGH-35515: [WIP][C++][Python] Add non decomposable aggregation UDFMay 9, 2023
@github-actions

Copy link
Copy Markdown

@github-actions

Copy link
Copy Markdown

⚠️ GitHub issue #35515has been automatically assigned in GitHub to PR creator.

@github-actionsgithub-actionsBot added the awaiting committer review Awaiting committer review label May 9, 2023
@icexelloss
icexellossforce-pushed the acero-group-agg-UDF-2 branch 2 times, most recently from 0dd8e25 to 2b38a2fCompareMay 9, 2023 15:31

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.

"Scalar" as supposed to the "grouped" aggregator which has difference interface:
https://github.com/apache/arrow/blob/main/cpp/src/arrow/compute/kernels/hash_aggregate.cc#L66

@github-actionsgithub-actionsBot added awaiting changes Awaiting changes awaiting change review Awaiting change review and removed awaiting committer review Awaiting committer review awaiting changes Awaiting changes labels May 9, 2023
Comment threadpython/pyarrow/tests/test_udf.py Outdated
Comment threadpython/pyarrow/src/arrow/python/udf.cc Outdated
@github-actionsgithub-actionsBot added awaiting changes Awaiting changes awaiting change review Awaiting change review and removed awaiting change review Awaiting change review awaiting changes Awaiting changes labels May 9, 2023
Comment threadpython/pyarrow/src/arrow/python/udf.cc Outdated
@github-actionsgithub-actionsBot added awaiting changes Awaiting changes and removed awaiting change review Awaiting change review labels May 15, 2023
@github-actionsgithub-actionsBot added Component: C++ awaiting change review Awaiting change review and removed awaiting changes Awaiting changes labels May 15, 2023
Comment threadcpp/src/arrow/engine/substrait/extension_set.cc Outdated
@github-actionsgithub-actionsBot added awaiting change review Awaiting change review and removed awaiting changes Awaiting changes labels Jun 5, 2023
@icexelloss
icexellossforce-pushed the acero-group-agg-UDF-2 branch from 7ba9cc8 to 1203346CompareJune 6, 2023 15:39
@icexelloss
icexellossforce-pushed the acero-group-agg-UDF-2 branch from 6044f20 to 17ff274CompareJune 6, 2023 21:53
@icexelloss

Copy link
Copy Markdown
ContributorAuthor

@westonpace I believe this PR is good to go. The failed CI seems unrelated. I have checked the Py refcount and it seems OK (I will add details in the comment thread above)

@github-actionsgithub-actionsBot added awaiting changes Awaiting changes and removed awaiting change review Awaiting change review labels Jun 7, 2023
@westonpace

Copy link
Copy Markdown
Member

@icexelloss I'll take another look through today.

@icexelloss

Copy link
Copy Markdown
ContributorAuthor

@icexelloss I'll take another look through today.

Thank you!

@westonpacewestonpace left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

A few more very minor suggestions but, overall, I think this is fine.

Comment threadpython/pyarrow/_compute.pyx Outdated
Comment threadpython/pyarrow/src/arrow/python/udf.cc Outdated
Comment threadpython/pyarrow/src/arrow/python/udf.cc Outdated
Comment threadpython/pyarrow/conftest.py Outdated
Comment on lines 331 to 332

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Ok, so the test case is verifying that the python function can take in *args if needed (even though it still lists the args when registering)?

std::vector<std::shared_ptr<DataType>> input_types,
std::shared_ptr<DataType> output_type)
: agg_cb(agg_cb), agg_function(agg_function), output_type(output_type) {
Py_INCREF(agg_function->obj());

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

This increment seems redundant given you already have one 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.

Admitted there could be some redundancy here. I created an follow up to take a closer look:

#36000

Comment threadpython/pyarrow/src/arrow/python/udf.cc Outdated
Comment threadpython/pyarrow/src/arrow/python/udf.cc Outdated
Comment threadpython/pyarrow/src/arrow/python/udf.cc Outdated
Comment threadpython/pyarrow/src/arrow/python/udf.cc Outdated
Comment threadpython/pyarrow/src/arrow/python/udf.cc Outdated
@github-actionsgithub-actionsBot added awaiting merge Awaiting merge awaiting changes Awaiting changes and removed awaiting changes Awaiting changes awaiting merge Awaiting merge labels Jun 8, 2023
Co-authored-by: Weston Pace <weston.pace@gmail.com>
@github-actionsgithub-actionsBot added awaiting change review Awaiting change review and removed awaiting changes Awaiting changes labels Jun 8, 2023
@icexelloss

Copy link
Copy Markdown
ContributorAuthor

I checked failed CI jobs and those seem unrelated.

@icexelloss
icexelloss merged commit 8b5919d into apache:mainJun 8, 2023
@github-actionsgithub-actionsBot added awaiting changes Awaiting changes and removed awaiting change review Awaiting change review labels Jun 8, 2023
@ursabot

Copy link
Copy Markdown

Benchmark runs are scheduled for baseline = e920bed and contender = 8b5919d. 8b5919d is a master commit associated with this PR. Results will be available as each benchmark for each run completes.
Conbench compare runs links:
[Finished ⬇️0.0% ⬆️0.0%] ec2-t3-xlarge-us-east-2
[Finished ⬇️1.15% ⬆️0.06%] test-mac-arm
[Finished ⬇️10.46% ⬆️6.21%] ursa-i9-9960x
[Finished ⬇️0.3% ⬆️0.0%] ursa-thinkcentre-m75q
Buildkite builds:
[Finished] 8b5919d8 ec2-t3-xlarge-us-east-2
[Finished] 8b5919d8 test-mac-arm
[Finished] 8b5919d8 ursa-i9-9960x
[Finished] 8b5919d8 ursa-thinkcentre-m75q
[Finished] e920bed4 ec2-t3-xlarge-us-east-2
[Finished] e920bed4 test-mac-arm
[Finished] e920bed4 ursa-i9-9960x
[Finished] e920bed4 ursa-thinkcentre-m75q
Supported benchmarks:
ec2-t3-xlarge-us-east-2: Supported benchmark langs: Python, R. Runs only benchmarks with cloud = True
test-mac-arm: Supported benchmark langs: C++, Python, R
ursa-i9-9960x: Supported benchmark langs: Python, R, JavaScript
ursa-thinkcentre-m75q: Supported benchmark langs: C++, Java

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.

[C++][Python] Non decomposable aggregation UDF

4 participants

@icexelloss@westonpace@ursabot@felipecrv
, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GH-35515: [C++][Python] Add non decomposable aggregation UDF by icexelloss · Pull Request #35514 · apache/arrow · GitHub
Skip to content

GH-35515: [C++][Python] Add non decomposable aggregation UDF - #35514

Merged
icexelloss merged 19 commits into
apache:mainfrom
icexelloss:acero-group-agg-UDF-2
Jun 8, 2023
Merged

GH-35515: [C++][Python] Add non decomposable aggregation UDF#35514
icexelloss merged 19 commits into
apache:mainfrom
icexelloss:acero-group-agg-UDF-2

Conversation

@icexelloss

@icexellossicexelloss commented May 9, 2023

Copy link
Copy Markdown
Contributor

Rationale for this change

Non decomposable aggregation is aggregation that cannot be split into consume/merge/finalize. This is often when the logic rewritten with external python libraries (numpy, pandas, statmodels, etc) and those either cannot be decomposed or not worthy the effect (these are often one-off function instead of reusable one). This PR implements the support for non decomposable aggregation UDFs.

The major issue with non decomposable UDF is that the UDF needs to see all data at once, unlike scalar UDF where UDF only needs to see a batch at a time. This makes non decomposable not so useful as it is same as collect all the data to a pd.DataFrame and apply the UDF on it. However, one very application of non decomposable UDF is with segmented aggregation. To refresh, segmented aggregation works on ordered data and passed one logic chunk at a time (e.g., all data with the same date). With segmented aggregation and non decomposable aggregation UDF, the user can apply any custom aggregation logic over large stream of ordered data, with the memory overhead of a single segment.

What changes are included in this PR?

This PR is currently WIP and not ready for review.

So far I have implemented the minimal amount of code to make a basic test working but needs clean up, error handling etc.

  • First round of self review
  • Second round of self review
  • Implement and test unary
  • Implement and test varargs
  • Implement and test Acero support with segmented aggregation

Are these changes tested?

Added new test calling with compute and acero.

The compute tests calls the aggregation on the full array. The acero test callings the aggregation with segmented aggregation.

Are there any user-facing changes?

@icexelloss
icexelloss requested a review from AlenkaF as a code ownerMay 9, 2023 15:16
@github-actions

Copy link
Copy Markdown

Thanks for opening a pull request!

If this is not a minor PR. Could you open an issue for this pull request on GitHub? https://github.com/apache/arrow/issues/new/choose

Opening GitHub issues ahead of time contributes to the Openness of the Apache Arrow project.

Then could you also rename the pull request title in the following format?

GH-${GITHUB_ISSUE_ID}: [${COMPONENT}] ${SUMMARY}

or

MINOR: [${COMPONENT}] ${SUMMARY}

In the case of PARQUET issues on JIRA the title also supports:

PARQUET-${JIRA_ISSUE_ID}: [${COMPONENT}] ${SUMMARY}

See also:

@icexellossicexelloss changed the title WIP: [C++][Python] Add non decomposable aggregation UDFGH-35515: [WIP][C++][Python] Add non decomposable aggregation UDFMay 9, 2023
@github-actions

Copy link
Copy Markdown

@github-actions

Copy link
Copy Markdown

⚠️ GitHub issue #35515has been automatically assigned in GitHub to PR creator.

@github-actionsgithub-actionsBot added the awaiting committer review Awaiting committer review label May 9, 2023
@icexelloss
icexellossforce-pushed the acero-group-agg-UDF-2 branch 2 times, most recently from 0dd8e25 to 2b38a2fCompareMay 9, 2023 15:31

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.

"Scalar" as supposed to the "grouped" aggregator which has difference interface:
https://github.com/apache/arrow/blob/main/cpp/src/arrow/compute/kernels/hash_aggregate.cc#L66

@github-actionsgithub-actionsBot added awaiting changes Awaiting changes awaiting change review Awaiting change review and removed awaiting committer review Awaiting committer review awaiting changes Awaiting changes labels May 9, 2023
Comment threadpython/pyarrow/tests/test_udf.py Outdated
Comment threadpython/pyarrow/src/arrow/python/udf.cc Outdated
@github-actionsgithub-actionsBot added awaiting changes Awaiting changes awaiting change review Awaiting change review and removed awaiting change review Awaiting change review awaiting changes Awaiting changes labels May 9, 2023
Comment threadpython/pyarrow/src/arrow/python/udf.cc Outdated
@github-actionsgithub-actionsBot added awaiting changes Awaiting changes and removed awaiting change review Awaiting change review labels May 15, 2023
@github-actionsgithub-actionsBot added Component: C++ awaiting change review Awaiting change review and removed awaiting changes Awaiting changes labels May 15, 2023
Comment threadcpp/src/arrow/engine/substrait/extension_set.cc Outdated
@github-actionsgithub-actionsBot added awaiting change review Awaiting change review and removed awaiting changes Awaiting changes labels Jun 5, 2023
@icexelloss
icexellossforce-pushed the acero-group-agg-UDF-2 branch from 7ba9cc8 to 1203346CompareJune 6, 2023 15:39
@icexelloss
icexellossforce-pushed the acero-group-agg-UDF-2 branch from 6044f20 to 17ff274CompareJune 6, 2023 21:53
@icexelloss

Copy link
Copy Markdown
ContributorAuthor

@westonpace I believe this PR is good to go. The failed CI seems unrelated. I have checked the Py refcount and it seems OK (I will add details in the comment thread above)

@github-actionsgithub-actionsBot added awaiting changes Awaiting changes and removed awaiting change review Awaiting change review labels Jun 7, 2023
@westonpace

Copy link
Copy Markdown
Member

@icexelloss I'll take another look through today.

@icexelloss

Copy link
Copy Markdown
ContributorAuthor

@icexelloss I'll take another look through today.

Thank you!

@westonpacewestonpace left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

A few more very minor suggestions but, overall, I think this is fine.

Comment threadpython/pyarrow/_compute.pyx Outdated
Comment threadpython/pyarrow/src/arrow/python/udf.cc Outdated
Comment threadpython/pyarrow/src/arrow/python/udf.cc Outdated
Comment threadpython/pyarrow/conftest.py Outdated
Comment on lines 331 to 332

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Ok, so the test case is verifying that the python function can take in *args if needed (even though it still lists the args when registering)?

std::vector<std::shared_ptr<DataType>> input_types,
std::shared_ptr<DataType> output_type)
: agg_cb(agg_cb), agg_function(agg_function), output_type(output_type) {
Py_INCREF(agg_function->obj());

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

This increment seems redundant given you already have one 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.

Admitted there could be some redundancy here. I created an follow up to take a closer look:

#36000

Comment threadpython/pyarrow/src/arrow/python/udf.cc Outdated
Comment threadpython/pyarrow/src/arrow/python/udf.cc Outdated
Comment threadpython/pyarrow/src/arrow/python/udf.cc Outdated
Comment threadpython/pyarrow/src/arrow/python/udf.cc Outdated
Comment threadpython/pyarrow/src/arrow/python/udf.cc Outdated
@github-actionsgithub-actionsBot added awaiting merge Awaiting merge awaiting changes Awaiting changes and removed awaiting changes Awaiting changes awaiting merge Awaiting merge labels Jun 8, 2023
Co-authored-by: Weston Pace <weston.pace@gmail.com>
@github-actionsgithub-actionsBot added awaiting change review Awaiting change review and removed awaiting changes Awaiting changes labels Jun 8, 2023
@icexelloss

Copy link
Copy Markdown
ContributorAuthor

I checked failed CI jobs and those seem unrelated.

@icexelloss
icexelloss merged commit 8b5919d into apache:mainJun 8, 2023
@github-actionsgithub-actionsBot added awaiting changes Awaiting changes and removed awaiting change review Awaiting change review labels Jun 8, 2023
@ursabot

Copy link
Copy Markdown

Benchmark runs are scheduled for baseline = e920bed and contender = 8b5919d. 8b5919d is a master commit associated with this PR. Results will be available as each benchmark for each run completes.
Conbench compare runs links:
[Finished ⬇️0.0% ⬆️0.0%] ec2-t3-xlarge-us-east-2
[Finished ⬇️1.15% ⬆️0.06%] test-mac-arm
[Finished ⬇️10.46% ⬆️6.21%] ursa-i9-9960x
[Finished ⬇️0.3% ⬆️0.0%] ursa-thinkcentre-m75q
Buildkite builds:
[Finished] 8b5919d8 ec2-t3-xlarge-us-east-2
[Finished] 8b5919d8 test-mac-arm
[Finished] 8b5919d8 ursa-i9-9960x
[Finished] 8b5919d8 ursa-thinkcentre-m75q
[Finished] e920bed4 ec2-t3-xlarge-us-east-2
[Finished] e920bed4 test-mac-arm
[Finished] e920bed4 ursa-i9-9960x
[Finished] e920bed4 ursa-thinkcentre-m75q
Supported benchmarks:
ec2-t3-xlarge-us-east-2: Supported benchmark langs: Python, R. Runs only benchmarks with cloud = True
test-mac-arm: Supported benchmark langs: C++, Python, R
ursa-i9-9960x: Supported benchmark langs: Python, R, JavaScript
ursa-thinkcentre-m75q: Supported benchmark langs: C++, Java

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.

[C++][Python] Non decomposable aggregation UDF

4 participants

@icexelloss@westonpace@ursabot@felipecrv
, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); })(); GH-35515: [C++][Python] Add non decomposable aggregation UDF by icexelloss · Pull Request #35514 · apache/arrow · GitHub
Skip to content

GH-35515: [C++][Python] Add non decomposable aggregation UDF - #35514

Merged
icexelloss merged 19 commits into
apache:mainfrom
icexelloss:acero-group-agg-UDF-2
Jun 8, 2023
Merged

GH-35515: [C++][Python] Add non decomposable aggregation UDF#35514
icexelloss merged 19 commits into
apache:mainfrom
icexelloss:acero-group-agg-UDF-2

Conversation

@icexelloss

@icexellossicexelloss commented May 9, 2023

Copy link
Copy Markdown
Contributor

Rationale for this change

Non decomposable aggregation is aggregation that cannot be split into consume/merge/finalize. This is often when the logic rewritten with external python libraries (numpy, pandas, statmodels, etc) and those either cannot be decomposed or not worthy the effect (these are often one-off function instead of reusable one). This PR implements the support for non decomposable aggregation UDFs.

The major issue with non decomposable UDF is that the UDF needs to see all data at once, unlike scalar UDF where UDF only needs to see a batch at a time. This makes non decomposable not so useful as it is same as collect all the data to a pd.DataFrame and apply the UDF on it. However, one very application of non decomposable UDF is with segmented aggregation. To refresh, segmented aggregation works on ordered data and passed one logic chunk at a time (e.g., all data with the same date). With segmented aggregation and non decomposable aggregation UDF, the user can apply any custom aggregation logic over large stream of ordered data, with the memory overhead of a single segment.

What changes are included in this PR?

This PR is currently WIP and not ready for review.

So far I have implemented the minimal amount of code to make a basic test working but needs clean up, error handling etc.

  • First round of self review
  • Second round of self review
  • Implement and test unary
  • Implement and test varargs
  • Implement and test Acero support with segmented aggregation

Are these changes tested?

Added new test calling with compute and acero.

The compute tests calls the aggregation on the full array. The acero test callings the aggregation with segmented aggregation.

Are there any user-facing changes?

@icexelloss
icexelloss requested a review from AlenkaF as a code ownerMay 9, 2023 15:16
@github-actions

Copy link
Copy Markdown

Thanks for opening a pull request!

If this is not a minor PR. Could you open an issue for this pull request on GitHub? https://github.com/apache/arrow/issues/new/choose

Opening GitHub issues ahead of time contributes to the Openness of the Apache Arrow project.

Then could you also rename the pull request title in the following format?

GH-${GITHUB_ISSUE_ID}: [${COMPONENT}] ${SUMMARY}

or

MINOR: [${COMPONENT}] ${SUMMARY}

In the case of PARQUET issues on JIRA the title also supports:

PARQUET-${JIRA_ISSUE_ID}: [${COMPONENT}] ${SUMMARY}

See also:

@icexellossicexelloss changed the title WIP: [C++][Python] Add non decomposable aggregation UDFGH-35515: [WIP][C++][Python] Add non decomposable aggregation UDFMay 9, 2023
@github-actions

Copy link
Copy Markdown

@github-actions

Copy link
Copy Markdown

⚠️ GitHub issue #35515has been automatically assigned in GitHub to PR creator.

@github-actionsgithub-actionsBot added the awaiting committer review Awaiting committer review label May 9, 2023
@icexelloss
icexellossforce-pushed the acero-group-agg-UDF-2 branch 2 times, most recently from 0dd8e25 to 2b38a2fCompareMay 9, 2023 15:31

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.

"Scalar" as supposed to the "grouped" aggregator which has difference interface:
https://github.com/apache/arrow/blob/main/cpp/src/arrow/compute/kernels/hash_aggregate.cc#L66

@github-actionsgithub-actionsBot added awaiting changes Awaiting changes awaiting change review Awaiting change review and removed awaiting committer review Awaiting committer review awaiting changes Awaiting changes labels May 9, 2023
Comment threadpython/pyarrow/tests/test_udf.py Outdated
Comment threadpython/pyarrow/src/arrow/python/udf.cc Outdated
@github-actionsgithub-actionsBot added awaiting changes Awaiting changes awaiting change review Awaiting change review and removed awaiting change review Awaiting change review awaiting changes Awaiting changes labels May 9, 2023
Comment threadpython/pyarrow/src/arrow/python/udf.cc Outdated
@github-actionsgithub-actionsBot added awaiting changes Awaiting changes and removed awaiting change review Awaiting change review labels May 15, 2023
@github-actionsgithub-actionsBot added Component: C++ awaiting change review Awaiting change review and removed awaiting changes Awaiting changes labels May 15, 2023
Comment threadcpp/src/arrow/engine/substrait/extension_set.cc Outdated
@github-actionsgithub-actionsBot added awaiting change review Awaiting change review and removed awaiting changes Awaiting changes labels Jun 5, 2023
@icexelloss
icexellossforce-pushed the acero-group-agg-UDF-2 branch from 7ba9cc8 to 1203346CompareJune 6, 2023 15:39
@icexelloss
icexellossforce-pushed the acero-group-agg-UDF-2 branch from 6044f20 to 17ff274CompareJune 6, 2023 21:53
@icexelloss

Copy link
Copy Markdown
ContributorAuthor

@westonpace I believe this PR is good to go. The failed CI seems unrelated. I have checked the Py refcount and it seems OK (I will add details in the comment thread above)

@github-actionsgithub-actionsBot added awaiting changes Awaiting changes and removed awaiting change review Awaiting change review labels Jun 7, 2023
@westonpace

Copy link
Copy Markdown
Member

@icexelloss I'll take another look through today.

@icexelloss

Copy link
Copy Markdown
ContributorAuthor

@icexelloss I'll take another look through today.

Thank you!

@westonpacewestonpace left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

A few more very minor suggestions but, overall, I think this is fine.

Comment threadpython/pyarrow/_compute.pyx Outdated
Comment threadpython/pyarrow/src/arrow/python/udf.cc Outdated
Comment threadpython/pyarrow/src/arrow/python/udf.cc Outdated
Comment threadpython/pyarrow/conftest.py Outdated
Comment on lines 331 to 332

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Ok, so the test case is verifying that the python function can take in *args if needed (even though it still lists the args when registering)?

std::vector<std::shared_ptr<DataType>> input_types,
std::shared_ptr<DataType> output_type)
: agg_cb(agg_cb), agg_function(agg_function), output_type(output_type) {
Py_INCREF(agg_function->obj());

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

This increment seems redundant given you already have one 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.

Admitted there could be some redundancy here. I created an follow up to take a closer look:

#36000

Comment threadpython/pyarrow/src/arrow/python/udf.cc Outdated
Comment threadpython/pyarrow/src/arrow/python/udf.cc Outdated
Comment threadpython/pyarrow/src/arrow/python/udf.cc Outdated
Comment threadpython/pyarrow/src/arrow/python/udf.cc Outdated
Comment threadpython/pyarrow/src/arrow/python/udf.cc Outdated
@github-actionsgithub-actionsBot added awaiting merge Awaiting merge awaiting changes Awaiting changes and removed awaiting changes Awaiting changes awaiting merge Awaiting merge labels Jun 8, 2023
Co-authored-by: Weston Pace <weston.pace@gmail.com>
@github-actionsgithub-actionsBot added awaiting change review Awaiting change review and removed awaiting changes Awaiting changes labels Jun 8, 2023
@icexelloss

Copy link
Copy Markdown
ContributorAuthor

I checked failed CI jobs and those seem unrelated.

@icexelloss
icexelloss merged commit 8b5919d into apache:mainJun 8, 2023
@github-actionsgithub-actionsBot added awaiting changes Awaiting changes and removed awaiting change review Awaiting change review labels Jun 8, 2023
@ursabot

Copy link
Copy Markdown

Benchmark runs are scheduled for baseline = e920bed and contender = 8b5919d. 8b5919d is a master commit associated with this PR. Results will be available as each benchmark for each run completes.
Conbench compare runs links:
[Finished ⬇️0.0% ⬆️0.0%] ec2-t3-xlarge-us-east-2
[Finished ⬇️1.15% ⬆️0.06%] test-mac-arm
[Finished ⬇️10.46% ⬆️6.21%] ursa-i9-9960x
[Finished ⬇️0.3% ⬆️0.0%] ursa-thinkcentre-m75q
Buildkite builds:
[Finished] 8b5919d8 ec2-t3-xlarge-us-east-2
[Finished] 8b5919d8 test-mac-arm
[Finished] 8b5919d8 ursa-i9-9960x
[Finished] 8b5919d8 ursa-thinkcentre-m75q
[Finished] e920bed4 ec2-t3-xlarge-us-east-2
[Finished] e920bed4 test-mac-arm
[Finished] e920bed4 ursa-i9-9960x
[Finished] e920bed4 ursa-thinkcentre-m75q
Supported benchmarks:
ec2-t3-xlarge-us-east-2: Supported benchmark langs: Python, R. Runs only benchmarks with cloud = True
test-mac-arm: Supported benchmark langs: C++, Python, R
ursa-i9-9960x: Supported benchmark langs: Python, R, JavaScript
ursa-thinkcentre-m75q: Supported benchmark langs: C++, Java

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.

[C++][Python] Non decomposable aggregation UDF

4 participants

@icexelloss@westonpace@ursabot@felipecrv