[ 
https://issues.apache.org/jira/browse/SPARK-58831?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

ASF GitHub Bot updated SPARK-58831:
-----------------------------------
    Labels: pull-request-available  (was: )

> Add bitmap scalar set operation functions
> -----------------------------------------
>
>                 Key: SPARK-58831
>                 URL: https://issues.apache.org/jira/browse/SPARK-58831
>             Project: Spark
>          Issue Type: New Feature
>          Components: SQL
>    Affects Versions: 5.0.0
>            Reporter: jiangxintong
>            Priority: Major
>              Labels: pull-request-available
>
> h2. Problem
> Spark's flat-bitmap infrastructure provides functions for constructing, 
> aggregating, and counting
> bitmaps, including {{bitmap_construct_agg}}, {{bitmap_or_agg}}, 
> {{bitmap_and_agg}},
> {{bitmap_count}}, {{bitmap_bucket_number}}, and {{bitmap_bit_position}}.
> However, Spark does not provide scalar set operations for combining two 
> precomputed bitmaps from
> the same row. Users currently need a UDF or application-side processing to 
> calculate bitmap
> intersection, union, difference, or symmetric difference. A native 
> implementation keeps these
> operations visible to Catalyst and whole-stage codegen and provides 
> consistent SQL, Scala,
> PySpark, and Spark Connect APIs.
> h2. Proposed Functions
> ||Function||Signature||Description||
> |bitmap_and|bitmap_and(BINARY, BINARY) -> BINARY|Returns the intersection of 
> two bitmaps.|
> |bitmap_or|bitmap_or(BINARY, BINARY) -> BINARY|Returns the union of two 
> bitmaps.|
> |bitmap_andnot|bitmap_andnot(BINARY, BINARY) -> BINARY|Returns the bits 
> present in the left bitmap but not in the right bitmap.|
> |bitmap_xor|bitmap_xor(BINARY, BINARY) -> BINARY|Returns the symmetric 
> difference of two bitmaps.|
> h2. Semantics
> * Both arguments use Spark's existing flat-bitmap Binary representation, not 
> a RoaringBitmap
>   serialization.
> * Each input may contain between 0 and 4096 bytes.
> * Missing bytes in a shorter input are treated as zero.
> * The result is always a new 4096-byte Binary value.
> * If either input is NULL, the result is NULL.
> * An input longer than 4096 bytes raises the structured error
>   {{BITMAP_INPUT_TOO_LARGE}}.
> * {{bitmap_andnot(left, right)}} is directional and computes
>   {{left AND NOT right}}.
> * These are scalar functions that combine two bitmaps from the same row. 
> Existing
>   {{bitmap_*_agg}} functions continue to combine bitmaps across rows.
> h2. Examples
> {code:sql}
> SELECT substring(hex(bitmap_and(X 'F0', X '70')), 0, 2);
> -- 70
> SELECT substring(hex(bitmap_or(X '10', X '20')), 0, 2);
> -- 30
> SELECT substring(hex(bitmap_andnot(X 'F0', X '70')), 0, 2);
> -- 80
> SELECT substring(hex(bitmap_xor(X 'F0', X '70')), 0, 2);
> -- 80
> {code}
> h2. API Surface
> * Spark SQL functions: {{bitmap_and}}, {{bitmap_or}}, {{bitmap_andnot}}, and 
> {{bitmap_xor}}.
> * Scala DataFrame functions under {{org.apache.spark.sql.functions}}.
> * PySpark classic and Spark Connect functions under {{pyspark.sql.functions}}.
> h2. Scope and Compatibility
> * The change is additive and does not alter the behavior of existing bitmap 
> functions.
> * It does not introduce a new bitmap storage format or change bucket-number 
> or bit-position
>   mapping.
> * It does not add or modify aggregate bitmap functions.
> * Existing SQL queries and APIs are unaffected.



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to