Scala 数据帧如何过滤掉?

时间:2021-07-23 06:54:08

标签: scala dataframe apache-spark apache-spark-sql

我有一个数据框 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在我的代码下是红色的。 那我该怎么办?

2 个答案:

答案 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|
+-------+---+

现在,让我们学习如何钓鱼:

  1. 创建合适的数据框(您的问题中未提及)
  2. 定义您想要做什么,输入
  • 将一个字符串列拆分为一个字符串数组
  • 测试这个数组是否包含另一列的值
  • 反转测试(和过滤器)
  1. 查看每个操作的互联网
  • 将字符串拆分为数组 -> 我找到了 split 方法,以及如何使用它的示例
  • 测试数组是否包含:找到array_contains和一个例子
  • 反转测试正如你所提到的

注意:

  • 这里我使用了“dataframe api”,在这里我象征性地声明了需要对数据帧列执行哪些操作。推荐用于此类操作(过滤 type Dataframe = Dataset[Row] 对象)
  • 您使用“rdd api”,您可以在数据帧的每个 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")