Как узнать во время выполнения Scala различные типы соединения искры - PullRequest
0 голосов
/ 04 января 2019

Я хотел бы проверить пользовательский ввод по белому списку доступных типов соединения Spark.

Есть ли способ узнать различные типы соединения со встроенной искрой?

Например, я хотел бы проверить вводимые пользователем данные по этому Seq Seq("inner", "cross", "outer", "full", "fullouter", "left", "leftouter", "right", "rightouter", "leftsemi", "leftanti")

(Все типы объединения доступны в Spark), без жесткого кодирования, как я только что сделал.

Ответы [ 2 ]

0 голосов
/ 04 января 2019

Извините, это невозможно без пиара в самом проекте Spark.Типы соединения определяются встроенными в JoinType.Существуют классы, которые расширяют JoinType, но соглашение об именах отличается от того, что для строк, используемых в операторе case.Боюсь, тебе не повезло.

https://github.com/apache/spark/blob/master/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/plans/joinTypes.scala

0 голосов
/ 04 января 2019

Я адаптировал ответ на этот вопрос здесь .Вы также можете добавить файл joinTypes в файл Json для чтения в runtume.Вы можете проверить этот ответ для обработки объектов json JsonParsing

Обновление 1: я обновляю ответ, следуя указаниям документации Spark JoinType

import org.apache.spark._
import org.apache.spark.sql._
import org.apache.spark.sql.expressions._
import org.apache.spark.sql.functions._


object SparkSandbox extends App {

  case class Row(id: Int, value: String)

  private[this] implicit val spark = SparkSession.builder().master("local[*]").getOrCreate()

  import spark.implicits._

  spark.sparkContext.setLogLevel("ERROR")

  val r1 = Seq(Row(1, "A1"), Row(2, "A2"), Row(3, "A3"), Row(4, "A4")).toDS()
  val r2 = Seq(Row(3, "A3"), Row(4, "A4"), Row(4, "A4_1"), Row(5, "A5"), Row(6, "A6")).toDS()
  val validUserJoinType = "inner"
  val inValiedUserJoinType = "nothing"

  val joinTypes = Seq("inner", "outer", "full", "full_outer", "left", "left_outer", "right", "right_outer", "left_semi", "left_anti")

  inValiedUserJoinType match {
    case x => if (joinTypes.contains(x)) {
      println("do some logic")
      joinTypes foreach { joinType =>
        println(s"${joinType.toUpperCase()} JOIN")
        r1.join(right = r2, usingColumns = Seq("id"), joinType = joinType).orderBy("id").show()
      }
    }
    case _ =>
  val supported = Seq(
    "inner",
    "outer", "full", "fullouter", "full_outer",
    "leftouter", "left", "left_outer",
    "rightouter", "right", "right_outer",
    "leftsemi", "left_semi",
    "leftanti", "left_anti",
    "cross")

  throw new IllegalArgumentException(s"Unsupported join type '$inValiedUserJoinType'. " +
  "Supported join types include: " + supported.mkString("'", "', '", "'") + ".")
  }

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