You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在PySpark中过滤任意类型的二进制数据列?

在PySpark中过滤任意二进制类型数据的解决方案

问题场景

给定如下DataFrame示例:

+------------------------------------------------------------------------------------------------------------------+
|id |                  binary_col                                                                                  |
+------------------------------------------------------------------------------------------------------------------+
| 1 | [08 01 10 0D 00 0E CC 93 01 00 00 00 01 00 00 00 00 00 00 00 80 FF BF 40 00 00 00 00 00 00 F0 3F BE 2B 00 00]|
| 2 | [08 01 10 0D 00 0E CC 93 01 00 00 00 01 00 00 00 00 00 00 00 F0 FF BF 40 00 00 00 00 00 00 F0 3F 57 66 00 00]|
| 3 | [08 01 10 0D 00 0E CC 93 01 00 00 00 01 00 00 00 00 00 00 00 C0 FF BF 40 00 00 00 00 00 00 F0 3F D5 69 00 00]|
| 4 | [08 01 10 0D 00 0E CC 93 01 00 00 00 01 00 00 00 00 00 00 00 80 FF BF 40 00 00 00 00 00 00 F0 3F 5A 60 00 00]|
+------------------------------------------------------------------------------------------------------------------+

Schema信息:

|-- id: int (nullable = true)
|-- binary_col: binary (nullable = true)

需求:筛选出binary_col值为指定长二进制数据的行,且无法通过id筛选(存在其他id对应相同二进制值)。此前尝试将二进制转为bigint的方法无效,原因是二进制数据长度远超bigint的容量限制,导致转换溢出。

解决方案

直接基于二进制类型进行等值过滤,无需转换为数值类型,具体有两种实现方式:

方法1:通过字节数组构造过滤条件

from pyspark.sql import functions as F

# 提取目标二进制对应的十六进制字符串,去除空格和方括号
target_hex = "08 01 10 0D 00 0E CC 93 01 00 00 00 01 00 00 00 00 00 00 00 80 FF BF 40 00 00 00 00 00 00 F0 3F BE 2B 00 00".replace(" ", "")
# 将十六进制字符串转为字节数组
target_bytes = bytes.fromhex(target_hex)
# 构造过滤条件并筛选
filtered_df = df.filter(F.col("binary_col") == F.lit(target_bytes).cast("binary"))
# 查看结果
filtered_df.show(truncate=False)

方法2:使用Spark内置函数转换十六进制字符串

from pyspark.sql import functions as F

# 目标二进制对应的无空格十六进制字符串
target_hex = "0801100D000ECC9301000000010000000000000080FFBF40000000000000F03FBE2B0000"
# 用unhex函数将十六进制字符串转为binary类型,直接进行等值过滤
filtered_df = df.filter(F.col("binary_col") == F.unhex(F.lit(target_hex)))
filtered_df.show(truncate=False)

原理说明

  • 之前转换bigint失败的核心原因:bigint仅支持64位数值,而目标二进制数据有36字节(288位),远超出其容量,导致转换时溢出,无法保留完整的二进制信息。
  • 上述两种方法均直接基于二进制类型进行比较,不会丢失数据,适用于任意长度的二进制数据,只要能获取目标二进制对应的十六进制字符串即可实现准确过滤。

内容的提问来源于stack exchange,提问作者Tiago Shimizu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 16:06:25