Java 如何将dataframe的UUID列转换为包含相同十六进制序列的简单字符串?

Java 如何将dataframe的UUID列转换为包含相同十六进制序列的简单字符串?,java,apache-spark,Java,Apache Spark,我需要将数据帧的UUID列转换为具有相同十六进制序列的字符串列,例如,如果特定字段具有以下值: JUUID("940bf38c-92d7-49fd-8ad0-67627c6b5084") 它应该转换列,使其输出 "940bf38c-92d7-49fd-8ad0-67627c6b5084" 我打印出了架构,发现该列以结构形式出现: |-- resourceId: struct (nullable = true) | |-- subType: b

我需要将数据帧的UUID列转换为具有相同十六进制序列的字符串列,例如,如果特定字段具有以下值:

JUUID("940bf38c-92d7-49fd-8ad0-67627c6b5084")
它应该转换列,使其输出

"940bf38c-92d7-49fd-8ad0-67627c6b5084"
我打印出了架构,发现该列以结构形式出现:

 |-- resourceId: struct (nullable = true)
 |    |-- subType: byte (nullable = false)
 |    |-- data: binary (nullable = true)
这就是为什么如果我将UDF定义为接受字符串的输入,它永远不会被调用。我应该如何处理这个问题

编辑 很抱歉,昨天我没有时间发布代码片段。在那之后我有了一些进步,我现在给出我的发现

我最初使用RDD加载Mongo文档:

JavaMongoRDD<Document> rdd = MongoSpark.load(sc);
产出如下:

"relativeId": {"$binary": "KUrqX+N+IP663myObpnOhA==", "$type": "03"}
从中,我了解了如何将二进制文件转换回十六进制格式

现在我需要做的是将二进制文件内联更改为JSON中正确的十六进制格式,并将它们写回。我花了一段时间研究数据集,看看是否可以使用UDF:

Dataset<Row> ds = rdd.toDF();

spark.sqlContext().udf().registerJava("UUIDTransformer", UUIDTransformer.class.getName(),
                DataTypes.StringType);

ds = ds.withColumn("resourceId2", functions.callUDF("UUIDTransformer", functions.col("resourceId")));
Dataset ds=rdd.toDF();
spark.sqlContext().udf().registerJava(“UUIDTransfer”,UUIDTransfer.class.getName(),
数据类型;
ds=ds.withColumn(“resourceId2”,functions.callUDF(“uuidtranformer”,functions.col(“resourceId”));
UDF如下所示:

public class UUIDTransformer implements UDF1<GenericRowWithSchema, String> {



//  @SuppressWarnings("deprecation")
public String call(GenericRowWithSchema columnValue) throws Exception {


    System.out.println("Value of col: " + columnValue.toString());
    return "Successful";
}

}
公共类UUIDTransfer实现UDF1{
//@SuppressWarnings(“弃用”)
公共字符串调用(GenericRowWithSchema columnValue)引发异常{
System.out.println(“列的值:+columnValue.toString());
返回“成功”;
}
}
这些值正在被打印出来,但它们不是我从RDD中将它们作为JSON时得到的相同二进制值,它们也无法转换回十六进制,因为它们给出了异常,即它们不是正确的十六进制代码。所以我又回到了RDDs


但现在的问题是,我如何将更改内联应用于每个这样的JUID列,这些列有时也嵌套在结构中?

为了使转换内联,我做了以下操作:

JsonObject jsonObject = new JsonParser().parse(json).getAsJsonObject();
使用我在OP中提到的链接中找到的UUID解码和编码程序,然后我继续使用以下代码替换现有的UUID列:

jsonObject.addProperty("resourceId", UUIDDecodeEncode
            .decompress(jsonObject.get("resourceId").getAsJsonObject().get("$binary").getAsString()).toString());
原始JSON中的resourceID列如下所示,我必须从中取出编码部分:

"resourceId":{"$binary":"vEOsgXxlT7oX5rKoOAGRrA==","$type":"03"}

您能提供一些代码来生成输入数据帧的示例吗?或者至少提供一个
show
方法打印内容的示例?@Oli,我现在已经给出了我尝试执行的代码片段。
"resourceId":{"$binary":"vEOsgXxlT7oX5rKoOAGRrA==","$type":"03"}