【问题标题】:Scala Spark - Discard empty keysScala Spark - 丢弃空键
【发布时间】:2016-08-09 08:38:23
【问题描述】:

我有以下地图:

 val pairs = lines.map( l => ( if (l.split(",")(1).toInt < 60) { "rest" } else if (l.split(",")(1).toInt > 110) { "sport" }, 10) ).reduceByKeyAndWindow((a:Int, b:Int) => (a+b), Seconds(12))

基本上,当某人的 HR 低于 60 时,它被归类为休息,超过 110 被归类为运动。元组的第二个变量表示这个人已经做了 10 分钟。

现在,这将为 60 到 110 之间的值映射一个空键。我想要的是完全丢弃它们。这如何实现?

所以从

("rest", 30)
("sport", 120)
((),10)

我正在尝试过滤掉((),10)。 我试过了

 pairs.filter{case (key, value) => key.length < 3} //error: value length is not a member of Any
 pairs.filter(_._1 != "")  //no error, just still keeps the empty keys, too   

似乎没有一个工作。

【问题讨论】:

  • Flatmap 是你的朋友。
  • 您能详细说明一下吗? :)
  • 抱歉,我正在接电话。在此处搜索 spark Scala 平面图。这个之前已经讨论过了。

标签: scala apache-spark


【解决方案1】:

您的问题是您的if 表达式返回String 以防匹配Unit 以防错过。您可以轻松修复您的filter

val pairs = lines.map(
  l => (if (l.split(",")(1).toInt < 60) {"rest"} else if (l.split(",")(1).toInt > 110) {"sport"}, 10))
    .filter(_._1 != ())

() 在 Scala 中是 Unit 类型的标识。

但这不是正确的方法,真的。结果仍然是 (Unit, Int) 的元组。使用此 if 语句,您正在丢失类型。

正确的方法是要么先过滤你的数据,然后有详尽的if

val pairs =
  lines.map(_.split(",")(1).toInt)
    .filter(hr => hr < 60 || hr > 110)
    .map(hr => (if (hr < 60) "rest" else "sport", 10))

或者使用collect,其中spark is the shortcut for.filter.map

val pairs =
  lines.map(_.split(",")(1).toInt)
    .collect{
      case hr if hr < 60 => "rest" -> 10
      case hr if hr > 110 => "sport" -> 10
    }

可能这个变体更具可读性。

另外,请注意我是如何将split 移动到单独的步骤中的。这样做是为了避免第二次调用 split 进行第二次 if 分支。

UPD。另一种方法是使用 flatMap,如 cmets 中所建议的:

val pairs =
  lines.flatMap(_.split(",")(1).toInt match{
      case hr if hr < 60 => Some("rest" -> 10)
      case hr if hr > 110 => Some("sport" -> 10)
      case _ => None
    })

它可能会也可能不会更有效,因为它避免了filter 步骤,但在Option 中添加了包装和展开元素。您可以测试不同方法的性能并告诉我们结果。

【讨论】:

    【解决方案2】:

    注意:不是这个问题的直接答案。但它可能对使用数据框的用户有用

    在Dataframe中,我们可以使用drop函数来删除不包含指定列值的行

    在这种情况下,您可以使用 sc.parallelize 和 toDF 来构造数据框。然后你就可以使用 df.drop()

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-03-27
      • 2012-08-23
      • 1970-01-01
      • 2019-11-27
      • 2019-05-15
      • 2021-07-13
      • 2017-06-02
      • 2012-09-21
      相关资源
      最近更新 更多