我有一个数据框 df,它像下面的数据:
| path |dst|
|1->2->3| 2 |
|1->2->3| 4 |
现在我想过滤掉 dst isin 路径的位置,所以我想要的结果 df 如下:
| path |dst|
|1->2->3| 4 |
我尝试过:
df.filter(v=>v.getAs[String]("path").split("->").contains(v.getAs[String]("dst")))
返回路径包含dst的df,然后我想使用not:
df.filter(!(v=>v.getAs[String]("path").split("->").contains(v.getAs[String]("dst")))
df.filter(~(v=>v.getAs[String]("path").split("->").contains(v.getAs[String]("dst")))
但是Idea在我的代码下是红色的。 那我该怎么办?
答案 0 :(得分:2)
这是一个解决方案
val df = Seq("1->2->3" -> "2", "1->2->3" -> "4").toDF("path", "dst")
val dstNotInPath = df.filter(!array_contains(split($"path", "->"), $"dst"))
dstNotInPath.show
dstNotInPath: org.apache.spark.sql.Dataset[org.apache.spark.sql.Row] = [path:
string, dst: string]
+-------+---+
| path|dst|
+-------+---+
|1->2->3| 4|
+-------+---+
现在,让我们学习如何钓鱼:
split
方法,以及如何使用它的示例array_contains
和一个例子注意:
type Dataframe = Dataset[Row]
对象)Row
类型条目上应用 Scala 函数。这意味着该函数被序列化,发送给每个工作线程,并在 java/scala Row
实例上执行。答案 1 :(得分:1)
你可以这样写:
df2.filter(v=> !v.getAs[String]("path").split("->").contains(v.getAs[String]("dst")))
或者使用 DataFrame API 的解决方案:
df.withColumn("splitted_path",functions.split($"path", "->"))
.withColumn("filter_c",array_contains($"splitted_path", $"dst"))
.where(!$"filter_c")
.drop("splitted_path","filter_c")