gpt4 book ai didi

scala - 如何比较两个共享相同内容的 StructType?

转载 作者:行者123 更新时间:2023-12-05 09:19:16 25 4
gpt4 key购买 nike

好像StructType保留顺序,所以两个 StructType包含相同的 StructField s 不被认为是等效的。

例如:

val st1 = StructType(
StructField("ii",StringType,true) ::
StructField("i",StringType,true) :: Nil)

val st2 = StructType(
StructField("i",StringType,true) ::
StructField("ii",StringType,true) :: Nil)

println(st1 == st2)

返回 false即使他们都有StructField("i",StringType,true)StructField("ii",StringType,true) , 只是顺序不同。

我需要一个可以证明这两者等效的测试,因为就我的目的而言,这两者没有区别。

val schema1 = StructType(StructField("A",ArrayType(st1,true),true) :: Nil)

val schema2 = StructType(StructField("A",ArrayType(st2,true),true) :: Nil)

val final_schema = StructType((schema1 ++ schema2).distinct)

final_schmea 的结果应该只有一个 StructTypeA而不是两个,而是distinct考虑这两个 StructType因为不同,所以我最终得到两个不同的 StructField名为 A .所以我的问题是,有没有办法比较两个 StructType是基于他们的内容,而不是订单?

编辑:

经过进一步调查,由于StructType基本上是 Seq<StructField> ,我可以做到content comparison for that works for Seq , 但我正在想办法对嵌入式 StructType 进行比较最有效。

最佳答案

这可能会被清理干净,但它可以工作并处理嵌套的 StructType:

def isEqual(struct1: StructType, struct2: StructType): Boolean = {
struct1.headOption match {
case Some(field) => {
if(field.dataType.typeName != "struct") {
struct2.find(_ == field) match {
case Some(matchedField) => isEqual(StructType(struct1.filterNot(_ == field)), StructType(struct2.filterNot(_ == field)))
case None => false
}
} else {
val isEqualContents = struct2.find(x => x.name == field.name && x.nullable == field.nullable && x.dataType.typeName == "struct") match {
case Some(matchedField) => isEqual(field.dataType.asInstanceOf[StructType], matchedField.dataType.asInstanceOf[StructType])
case None => false
}
if(isEqualContents) isEqual(StructType(struct1.filterNot(_ == field)), StructType(struct2.filterNot(_ == field))) else false
}
}
case None => struct2.size == 0
}
}

val st1 = StructType(
StructField("ii",StringType,true) ::
StructField("i",StringType,true) ::
StructField("iii", StructType(StructField("iv", StringType, true) :: Nil), true) :: Nil)

val st2 = StructType(
StructField("i",StringType,true) ::
StructField("ii",StringType,true) ::
StructField("iii", StructType(StructField("v", StringType, true) :: Nil), true) :: Nil)

isEqual(st1, st2)

它也可以使用更多的爱来变成尾递归。

关于scala - 如何比较两个共享相同内容的 StructType?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41372002/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com