【问题标题】:How to filter a spark's dataframe array with scala如何使用 scala 过滤火花的数据帧数组
【发布时间】:2018-10-27 01:41:18
【问题描述】:

我是 Scala 的初学者。

我有一个包含 2 列的数据框:

第一个是日期,第二个是单词数组。

created_at:string
words:array
    element:string

我希望只保留以“#”开头的单词

我更喜欢在爆炸数组之前制作过滤器,因为大多数单词不以'#'开头

我没有找到修改数组列并应用过滤器(_.startsWith("#")) 之类的方法。

有可能吗?以及如何?

谢谢

皮埃尔

【问题讨论】:

标签: arrays scala apache-spark dataframe


【解决方案1】:

您可以创建一个简单的 UDF 来过滤掉数组列中不需要的单词:

val df = Seq(
  ("2018-05-01", Seq("a", "#b", "c")),
  ("2018-05-02", Seq("#d", "#e", "f"))
).toDF("created_at", "words")

def filterArray = udf( (s: Seq[String]) =>
  s.filterNot(_.startsWith("#"))
)

df.select($"created_at", filterArray($"words")).show
// +----------+----------+
// |created_at|UDF(words)|
// +----------+----------+
// |2018-05-01|    [a, c]|
// |2018-05-02|       [f]|
// +----------+----------+

【讨论】:

  • 正是我想要的。谢谢!
【解决方案2】:

试试这个:

import org.apache.spark.sql.functions._ 

df.select(explode(col("words")).as("word"), col("created_at")).
       where("word LIKE '#%'").
       groupBy(col("created_at")).
       agg(collect_set(col("word")).as("words")).
       show

【讨论】:

  • 它应该可以工作,但它首先会爆炸数组。我想避免它。仍然是一个很好的代码示例,谢谢
猜你喜欢
  • 2016-05-01
  • 2020-08-09
  • 2019-01-14
  • 2015-12-16
  • 2020-02-13
  • 2016-04-22
  • 1970-01-01
  • 2023-03-29
  • 2019-04-12
相关资源
最近更新 更多