如何在Apache Spark(PySpark)中无需UDF将二进制转UUID字符串?
不用UDF实现PySpark二进制UUID转字符串
当然可以通过PySpark原生函数实现,不需要自定义UDF。核心思路是先将二进制数据转为十六进制字符串,再按照UUID的格式(8-4-4-4-12的字符分段)插入分隔符拼接即可。
替换UDF的原生函数实现代码
from pyspark.sql import DataFrame, SparkSession import pyspark.sql.functions as F import uuid from pyspark.sql.types import Row spark_test_instance = (SparkSession .builder .master('local') .getOrCreate()) df: DataFrame = spark_test_instance.createDataFrame([Row()]) # 生成二进制UUID列 df = df.withColumn("id", F.lit(uuid.uuid4().bytes)) df = df.withColumn("length", F.length(df["id"])) # 原生函数实现二进制转UUID字符串 df = df.withColumn("hex_str", F.lower(F.hex(F.col("id")))) df = df.withColumn("id_str", F.concat_ws("-", F.substring(F.col("hex_str"), 1, 8), F.substring(F.col("hex_str"), 9, 4), F.substring(F.col("hex_str"), 13, 4), F.substring(F.col("hex_str"), 17, 4), F.substring(F.col("hex_str"), 21, 12) )) df = df.withColumn("length_str", F.length(df["id_str"])) df.printSchema() df.show(1, truncate=False)
运行结果
root |-- id: binary (nullable = false) |-- length: integer (nullable = false) |-- hex_str: string (nullable = false) |-- id_str: string (nullable = false) |-- length_str: integer (nullable = false) +-------------------------------------------------+------+----------------------------------+------------------------------------+----------+ |id |length|hex_str |id_str |length_str| +-------------------------------------------------+------+----------------------------------+------------------------------------+----------+ |[2D 1B 7C 5A 3E F9 4D 8B 8A 7D 2F 1E 3C 4D 5E 6F]|16 |2d1b7c5a3ef94d8b8a7d2f1e3c4d5e6f|2d1b7c5a-3ef9-4d8b-8a7d-2f1e3c4d5e6f|36 | +-------------------------------------------------+------+----------------------------------+------------------------------------+----------+
关键函数说明
F.hex():将二进制数据转换为大写的十六进制字符串,配合F.lower()转为小写,和示例输出格式一致。F.substring(col, pos, len):从指定位置开始截取指定长度的字符串片段,对应UUID的各个分段。F.concat_ws(sep, *cols):以指定分隔符拼接多个字符串列,这里用-拼接UUID的五个分段。
内容的提问来源于stack exchange,提问作者raphaelauv
相关产品推荐
相关产品推荐

