在AWS Glue中如何将Spark的StringType二进制列转为UUID字符串?
解决方案:将Aurora导出CSV中的二进制UUID列转换为标准UUID字符串
背景
我们基于AWS Glue构建数据处理组件,流程为:
- 从Aurora RDS导出表到S3 CSV文件,使用语句:
SELECT * FROM TableA INTO OUTFILE S3 's3_path' FORMAT CSV HEADER - 将CSV文件转换为Parquet格式
核心问题:所有以cod_idef_开头的列在Aurora中为Binary类型(存储UUID二进制数据),但Spark读取CSV时会将其推断为StringType,需将这些列转换为标准UUID字符串(例如00000000-8a3a-46b2-84c2-a227836ea168)。
原代码的问题
你尝试的UDF逻辑存在偏差:Aurora导出CSV时,Binary类型会以十六进制字符串形式存储,直接将字符串转为bytearray会把每个字符的ASCII码当作字节处理,无法正确还原UUID二进制数据。
修正后的实现
方法1:优化Python UDF(易读性强)
import uuid from pyspark.sql.functions import udf, col from pyspark.sql.types import StringType def hex_str_to_uuid(hex_str): if hex_str and len(hex_str) == 32: # 将十六进制字符串转为UUID格式 return str(uuid.UUID(hex=hex_str)) else: return None # 注册UDF hex_to_uuid_udf = udf(hex_str_to_uuid, StringType()) # 获取需要转换的列 columns_to_convert = [col_name for col_name in df.columns if col_name.startswith("cod_idef_")] # 批量转换列 for col_name in columns_to_convert: df = df.withColumn(col_name, hex_to_uuid_udf(col(col_name)))
方法2:Spark内置函数实现(性能更优)
避免Python UDF的性能开销,直接用Spark内置函数组合完成转换:
from pyspark.sql.functions import expr, col columns_to_convert = [col_name for col_name in df.columns if col_name.startswith("cod_idef_")] for col_name in columns_to_convert: df = df.withColumn( col_name, expr(f"uuid_from_string(concat(substring({col_name},1,8), '-', substring({col_name},9,4), '-', substring({col_name},13,4), '-', substring({col_name},17,4), '-', substring({col_name},21,12)))") )
说明:通过对十六进制字符串分段拼接,再用uuid_from_string生成标准UUID格式。
验证方式
转换后可通过以下代码验证结果:
df.select([col(c) for c in columns_to_convert]).show(truncate=False)
内容的提问来源于stack exchange,提问作者Allen Vieira
相关产品推荐
相关产品推荐

