Java 如何将dataframe的UUID列转换为包含相同十六进制序列的简单字符串?
我需要将数据帧的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
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"}