如何根据条件Spark Scala

时间:2016-02-25 19:29:23

标签: apache-spark

我有一些数据如下,我已经阅读了常见的Spark RDD(没有Schema):

before transformation

现在,我想创建一个新列。如果客户的事件包含w作为值,则每个客户的新列将设置为1。因此得到的RDD将是:

after treansformation

我还没有能够做到这一点。到目前为止我所拥有的是以下内容,其中data1是读入RDD的数据:

val data2 = data1.groupBy(_._2)
  .map(_._2.map{ case (a1: Array[String],   a2, a3, a4) =>
    val myString  = "w"
    if (a1.contains(myString)) { (a1,a2,a3,a4,array_of_ones) else (a1,a2,a3,a4,array_of_zeros)}
       })

1http://i.stack.imgur.com/P7bTx.jpgenter代码

在上面,array_of_ones和array_of_zeros必须与每个分区的a1具有相同的长度。我怎样才能做到这一点?如果可能,请假设不允许加入RDD。谢谢。

1 个答案:

答案 0 :(得分:1)

您可以解决此问题的一种方法是使用DataFrames

import org.apache.spark.sql.expressions.Window
import org.apache.spark.sql.functions.sum

val df = data1.toDF("event", "customer", "indicator1", "indicator2")
val w = Window.partitionBy($"customer").rowsBetween(Long.MinValue, Long.MaxValue)

val isW = ($"event" === "w").cast("long")
val indicator3 = (sum(isW).over(w) > 0).cast("long")

df.withColumn("indicator3", indicator3)