有人可以解释下面的代码片段中发生了什么吗?我正在尝试了解以下Scala代码

时间:2019-10-28 15:33:18

标签: scala apache-spark databricks

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

def expr(myCols: Set[String], allCols: Set[String]) =
  allCols.toList.map {
    case x if myCols.contains(x) => col(x)
    case x => lit(null).as(x)
  }

1 个答案:

答案 0 :(得分:1)

此方法返回一个Columns的列表,当您使用此列表从数据框中选择列时,某些列设置为null

allCols应该包含数据框的所有列,而myCols应该包含要保留的列。 myCols中未包含的所有其他列将被设置为null

val df = spark.createDataFrame(Seq((1,2,3),(4,5,6),(7,8,9))).toDF("a","b","c")
df.show
val columns = expr(Set("a"), df.columns.toSet)
df.select(columns:_*).show

将打印

 +---+---+---+
|  a|  b|  c|
+---+---+---+
|  1|  2|  3|
|  4|  5|  6|
|  7|  8|  9|
+---+---+---+

+---+----+----+
|  a|   b|   c|
+---+----+----+
|  1|null|null|
|  4|null|null|
|  7|null|null|
+---+----+----+

在您的方法内部,通过使用Scala的pattern matching魔术,allCols的每个条目要么映射到实际列,要么映射到null文字。