Spark SQL не вызывает мой UDT-метод равных / хэш-кодов - PullRequest
0 голосов
/ 06 мая 2019

Я хочу реализовать свои операторы сравнения (равно, хэш-код, порядок) в типе данных, определенных мной в Spark SQL.Хотя Spark SQL UDT все еще остается закрытым, я следую некоторым примерам, таким как this , чтобы обойти эту ситуацию.

У меня есть класс MyPoint:

@SQLUserDefinedType(udt = classOf[MyPointUDT])
case class MyPoint(x: Double, y: Double) extends Serializable {

  override def hashCode(): Int = {
    println("hash code")
    31 * (31 * x.hashCode()) + y.hashCode()
  }

  override def equals(other: Any): Boolean =  {
    println("equals")
    other match {
      case that: MyPoint => this.x == that.x && this.y == that.y
      case _ => false
    }
  }

Затем у меня есть класс UDT:

private class MyPointUDT extends UserDefinedType[MyPoint] {
  override def sqlType: DataType = ArrayType(DoubleType, containsNull = false)

  override def serialize(obj: MyPoint): ArrayData = {
    obj match {
      case features: MyPoint =>
        new GenericArrayData2(Array(features.x, features.y))
    }
   }

   override def deserialize(datum: Any): MyPoint = {
    datum match {
      case data: ArrayData if data.numElements() == 2 => {
        val arr = data.toDoubleArray()
        new MyPoint(arr(0), arr(1))
      }
    }
   }

  override def userClass: Class[MyPoint] = classOf[MyPoint]

  override def asNullable: MyPointUDT = this
}

Затем я создаю простой DataFrame:

val p1 = new MyPoint(1.0, 2.0)
val p2 = new MyPoint(1.0, 2.0)
val p3 = new MyPoint(10.0, 20.0)
val p4 = new MyPoint(11.0, 22.0)

val points = Seq(
  ("P1", p1),
  ("P2", p2),
  ("P3", p3),
  ("P4", p4)
).toDF("label", "point")

points.registerTempTable("points")
spark.sql("SELECT Distinct(point) FROM points").show()

Проблема заключается в следующем: почему SQL-запрос не выполняет метод equals внутри класса MyPoint?Как проводится сравнение?Как я могу реализовать свои операторы сравнения в этом примере?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...