如何获取Cassandra UUID列在PySpark DataFrame中的字符串表示?
解决PySpark读取Cassandra UUID字段转字符串的问题
问题原因
你遇到的新列返回null的问题,核心是传入UDF的input_val不是字符串,而是Spark解析Cassandra UUID后生成的结构化对象(包含__class__和int属性)。直接把这个对象传给uuid.UUID()会触发ValueError,导致UDF返回null。
正确解决方法
需要从这个结构化对象中提取int字段(UUID的128位整数表示),再用它构建UUID对象并转为标准字符串格式。
修正后的UDF代码
import uuid from pyspark.sql.functions import udf from pyspark.sql.types import StringType def uuid_to_str(input_val): if not input_val: return None try: # 提取对象中的int属性,构建UUID并转为标准字符串 return str(uuid.UUID(int=input_val.int)) except AttributeError: # 处理非预期格式的异常情况 return None # 注册UDF uuid_str_udf = udf(uuid_to_str, StringType()) # 应用到DataFrame生成目标列 df = df.withColumn('msg_id_string', uuid_str_udf(df['msg_id']))
关键说明
- Spark读取Cassandra UUID时,会将其存储为带
int属性的内部对象,这个int值是UUID的128位整数原始表示 - 通过
uuid.UUID(int=...)可以将整数还原为UUID对象,再用str()直接转为007550ad-802f-11ed-a92a-0f3d2bcd625e这类标准格式 - 增加空值判断和异常捕获,避免非预期数据导致的任务报错
内容的提问来源于stack exchange,提问作者Ibrahim Hamouda
相关产品推荐
相关产品推荐

