Spark Dataset添加UUID列遇重复问题:如何实现每行唯一UUID
解决Spark Dataset每行生成唯一UUID的问题
这问题我之前也碰到过!你当前代码的问题在于:UUID.randomUUID().toString()是在Driver端只执行一次,生成的是一个固定字符串,随后被当作常量列添加到数据集的所有行中,所以才会出现所有行UUID完全相同的情况。
给你两种靠谱的解决方案:
方案一:使用Spark内置的uuid()函数(推荐)
Spark已经内置了专门生成每行唯一UUID的函数,直接调用即可,简单高效:
getDataset(Transaction.class) .withColumn("uniqueId", functions.uuid()) .show(false);
这个函数会在Executor端为每行单独生成UUID,保证每行的值都是唯一的。
方案二:自定义无参数UDF
如果你的Spark版本较旧(不过大部分新版本都支持内置uuid()),可以自定义一个UDF,让它在每行数据处理时生成UUID:
方式1:注册UDF后调用
// 定义生成UUID的无参数UDF UDF0<String> generateUUID = () -> UUID.randomUUID().toString(); spark.udf().register("generateUUID", generateUUID, DataTypes.StringType); // 在Dataset中使用该UDF getDataset(Transaction.class) .withColumn("uniqueId", functions.callUDF("generateUUID")) .show(false);
方式2:直接在withColumn中使用匿名UDF
getDataset(Transaction.class) .withColumn("uniqueId", functions.udf( () -> UUID.randomUUID().toString(), DataTypes.StringType ).apply()) .show(false);
这两种方案都能确保每行生成独立的UUID,替换你原来的代码后就能得到预期结果啦!
内容的提问来源于stack exchange,提问作者Adiant
相关产品推荐
相关产品推荐

