При использовании любого из '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) {
...
}