Есть ли в Apache Spark Scala API разница между использованием одной одинарной кавычки и обозначения $ ""? - PullRequest
0 голосов
/ 03 декабря 2018

Я заметил два разных стиля обозначений при обращении к столбцам (в данном случае в операторе select).Есть ли функциональная разница между ними?

val df = spark.read.table("mytable").select('column1,'column2)

против

val df = spark.read.table("mytable").select($"column1",$"column2")

Я не смог найти ничего, что действительно объясняет разницу или есть какой-то стандарт.

1 Ответ

0 голосов
/ 04 декабря 2018

При использовании любого из 'column1,'column2 или $"column1",$"column2" возвращаемое значение будет ColumnName(column1), ColumnName(column2), что является подклассом Column(), который является одним из ожидаемых типов select.Однако их реализации различны.

Чтобы использовать символы, импорт import spark.implicits._ должен быть включен в приложение, где spark является объектом SparkSession.Импорт гарантирует, что следующие последствия доступны и находятся в области действия.

Из кода Spark

   @Experimental
      object implicits extends SQLImplicits with Serializable {
        protected override def _sqlContext: SQLContext = SparkSession.this.sqlContext
      }

spark.implicits расширяет SQLImplicits

package org.apache.spark.sql

abstract class SQLImplicits extends LowPrioritySQLImplicits {

   ...

  /**
   * Converts $"col name" into a [[Column]].
   *
   * @since 2.0.0
   */
  implicit class StringToColumn(val sc: StringContext) {
    def $(args: Any*): ColumnName = {
      new ColumnName(sc.s(args: _*))
    }
  }

  ...

   /**
   * An implicit conversion that turns a Scala `Symbol` into a [[Column]].
   * @since 1.3.0
   */
  implicit def symbolToColumn(s: Symbol): ColumnName = new ColumnName(s.name)

}  

При использовании $column1, метод $ в неявном классе *Вызывается 1023 *, который преобразует String в ColumnName экземпляр.

' - это символ скалы.Для его использования import spark.implicits._ не требуется.однако для преобразования символа Scala в Column необходим импорт.При использовании этого символа выполняется неявный метод symbolToColumn, который возвращает экземпляр ColumnName.Обратите внимание, что 'column1 совпадает с Symbol("column1") в Scala.

С org.apache.spark.sql.Column.scala, ColumnName является подклассом Column.поэтому возвращенные объекты из $ и ' могут использоваться в методах DataFrame / Dataset select.

/**
 * A convenient class used for constructing schema.
 *
 * @since 1.3.0
 */
@InterfaceStability.Stable
class ColumnName(name: String) extends Column(name) {
    ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...