如何在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
相关产品推荐
相关产品推荐

