Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala Spark:有条件地将列添加到数据帧_Scala_Apache Spark_Apache Spark Sql_Spark Dataframe - Fatal编程技术网

Scala Spark:有条件地将列添加到数据帧

Scala Spark:有条件地将列添加到数据帧,scala,apache-spark,apache-spark-sql,spark-dataframe,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查询,我可以轻松地做到这一点

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

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查询


我试过
。用column
,但我不能让它做我想做的事。

像这样的东西怎么样

val newDF = df.filter($"B" === "").take(1) match {
  case Array() => df
  case _ => df.withColumn("D", $"B" === "")
}

使用
take(1)
应该不会有太大影响

我的错是,我遗漏了问题的一部分

最好、最干净的方法是使用
UDF
。 代码中的解释

// create some example data...BY DataFrame
// note, third record has an empty string
case class Stuff(a:String,b:Int)
val d= sc.parallelize(Seq( ("a",1),("b",2),
     ("",3) ,("d",4)).map { x => Stuff(x._1,x._2)  }).toDF

// now the good stuff.
import org.apache.spark.sql.functions.udf
// function that returns 0 is string empty 
val func = udf( (s:String) => if(s.isEmpty) 0 else 1 )
// create new dataframe with added column named "notempty"
val r = d.select( $"a", $"b", func($"a").as("notempty") )

    scala> r.show
+---+---+--------+
|  a|  b|notempty|
+---+---+--------+
|  a|  1|    1111|
|  b|  2|    1111|
|   |  3|       0|
|  d|  4|    1111|
+---+---+--------+

当如下所示时,尝试使用列的功能:

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()
shows

+---+----+---+---+
|  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
之后的版本,这里只有一个数据帧。你可能想重读这个问题,这正是我想要的。我用
尝试了两种不同的方法,分别是
或者
,但我想我的格式是错误的。有点离题,但你们知道Spark是如何处理专栏的吗?比如,如果我要添加~20个列,那么使用20.withColumn并将其保留为数据帧还是将其映射到RDD并将其全部添加到映射中,然后转换回数据帧以保存到拼花地板会更快?刚刚找到。我认为UDF是我正在寻找的。为什么这不适用于if<如果(df(“B”)点亮(0)或点亮(1))
@SumitKumarGhosh
df(“B”)
是一列,则代码>df.with列(“D”)。条件
df(“B”)==“
永远不应该为true,因为列与字符串不是同一类型的对象。此外,条件
df(“B”)==“
是全有或全无条件。它不是按行计算的,我想这是您想要的。
when
/
否则
语法做了正确的事情,相比之下,我们可以在应用when时执行“in”查询吗