我有一些数据如下,我已经阅读了常见的Spark RDD(没有Schema):
现在,我想创建一个新列。如果客户的事件包含w作为值,则每个客户的新列将设置为1。因此得到的RDD将是:
我还没有能够做到这一点。到目前为止我所拥有的是以下内容,其中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)}
})
1:http://i.stack.imgur.com/P7bTx.jpgenter代码
在上面,array_of_ones和array_of_zeros必须与每个分区的a1具有相同的长度。我怎样才能做到这一点?如果可能,请假设不允许加入RDD。谢谢。
答案 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)