我有一个火花数据帧 DF与模式作为这样:如何在Spark数据框中进行组合并进行过滤?
[id:string, label:string, tags:string]
id | label | tag
---|-------|-----
1 | h | null
1 | w | x
1 | v | null
1 | v | x
2 | h | x
3 | h | x
3 | w | x
3 | v | null
3 | v | null
4 | h | null
4 | w | x
5 | w | x
(H,W,V是标签x可以是任何非空值)
每个ID,有最多只有一个标签“h”或“w”,但可能会有多个“v”。我想选择所有符合以下条件的ID:
每个ID都有: 1.一个标签“h”及其标签= null, 2.一个标签“w”及其标签!= null, 3.每个ID至少有一个标签“v”。
我在想,我需要创建三列检查上述条件。然后我需要通过“id”做一个组。
val hCheck = (label: String, tag: String) => {if (label=="h" && tag==null) 1 else 0}
val udfHCheck = udf(hCheck)
val wCheck = (label: String, tag: String) => {if (label=="w" && tag!=null) 1 else 0}
val udfWCheck = udf(wCheck)
val vCheck = (label: String) => {if (label==null) 1 else 0}
val udfVCheck = udf(vCheck)
dfx = df.withColumn("hCheck", udfHCheck(col("label"), col("tag")))
.withColumn("wCheck", udfWCheck(col("label"), col("tag")))
.withColumn("vCheck", udfVCheck(col("label")))
.select("id","hCheck","wCheck","vCheck")
.groupBy("id")
不知何故我需要组三列{ “H检查”, “W检查”, “需求,vCheck”}入列表的矢量[X,0,0],[0,X,0],[0, 0,x]中。并检查这些向量是否包含全部三个{[1,0,0],[0,1,0],[0,0,1]}
我还没有能够解决这个问题呢。并且可能会有比这更好的方法。希望有人能给我建议。由于
我找到了解决方法,将数据帧转换回rdd。但是你的解决方案很好,我喜欢它。非常感谢你! – neikusc