scala - Spark : Add column to dataframe conditionally

标签 scala apache-spark apache-spark-sql spark-dataframe

我正在尝试获取我的输入数据:

A    B       C
--------------
4    blah    2
2            3
56   foo     3

并根据 B 是否为空在末尾添加一列:
A    B       C     D
--------------------
4    blah    2     1
2            3     0
56   foo     3     1

我可以通过将输入数据框注册为临时表,然后键入 SQL 查询来轻松完成此操作。

但我真的很想知道如何只使用 Scala 方法来做到这一点,而不必在 Scala 中输入 SQL 查询。

我试过 .withColumn ,但我不能让它做我想做的事。

最佳答案

试试 withColumn与功能 when如下:

val sqlContext = new SQLContext(sc)
import sqlContext.implicits._ // for `toDF` and $""
import org.apache.spark.sql.functions._ // for `when`

val df = sc.parallelize(Seq((4, "blah", 2), (2, "", 3), (56, "foo", 3), (100, null, 5)))
    .toDF("A", "B", "C")

val newDf = df.withColumn("D", when($"B".isNull or $"B" === "", 0).otherwise(1))
newDf.show()显示
+---+----+---+---+
|  A|   B|  C|  D|
+---+----+---+---+
|  4|blah|  2|  1|
|  2|    |  3|  0|
| 56| foo|  3|  1|
|100|null|  5|  0|
+---+----+---+---+

我添加了 (100, null, 5)用于测试 isNull 的行案件。

我用 Spark 1.6.0 试过这个代码但正如 when 的代码中所评论的那样, 它适用于 1.4.0 之后的版本.

关于scala - Spark : Add column to dataframe conditionally,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34908448/

相关文章:

java - 有什么方法可以在纯 Java Maven2 项目中获得 BeanShell(或 Scala、JRuby)REPL?

scala - 如何使用正则表达式在 Scala 中提取匹配字符串?

scala - 将scala-compiler.jar添加为运行时依赖项

scala - 将 Free Monad 与 Either 一起使用

scala - 如何将正则表达式解析为整个 spark 数据框而不是每一列?

apache-spark - Spark 流 : Reading data from kafka that has multiple schema

apache-spark - 运行比内核数量更多的分区是否有意义?

scala - 如何在Spark中的执行器之间同步功能以避免在写入Elastic时并发

java-8 - 如何在 Spark SQL 中向现有 Dataframe 添加新列

scala - Spark如何并行读写多个表?