当前位置: 首页 > 知识库问答 >
问题:

Scala Spark-丢弃空键

荆树
2023-03-14
 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))
("rest", 30)
("sport", 120)
((),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   

似乎都没用。

共有1个答案

郑乐池
2023-03-14

您的问题是if表达式在不匹配unit的情况下返回string。您可以轻松修复筛选:

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语句时会丢失类型。

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

可能这个变体更易读。

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

UPD.另一种方法是使用flatmap,如注释中所建议的:

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
    })
 类似资料:
  • 除了前一节介绍的权重衰减以外,深度学习模型常常使用丢弃法(dropout)[1] 来应对过拟合问题。丢弃法有一些不同的变体。本节中提到的丢弃法特指倒置丢弃法(inverted dropout)。 方法 回忆一下,“多层感知机”一节的图3.3描述了一个单隐藏层的多层感知机。其中输入个数为4,隐藏单元个数为5,且隐藏单元$h_i$($i=1, \ldots, 5$)的计算表达式为 $$h_i = \p

  • 问题内容: 我正在使用Jsoup清理来自表单的用户输入。有问题的表单包含一个要求纯文本的表单。提交表单后,我使用; 清除输入。但是,由于html会忽略多余的空格,因此将从输入中删除有价值的空格字符。 例如,如果有人在中输入了一些文本行: 之后,您将拥有: 如何使保留空白?我知道它是为解析html而设计的,而不是html,因此还有更好的选择吗? 问题答案: 如果您的textarea只希望使用纯文本,

  • 我正在通过、和进行实时视频处理。 我已经在下面添加了核心代码。 驱动此操作的代码如下所示:

  • 我将事件发送到AWS Kinesis,这些事件由AWS lambda函数处理。但是,如果lambda抛出一些错误,则不会丢弃记录,并且会一次又一次地进行处理,从而阻止处理新记录。 我宁愿跳过错误的记录,消化新的记录。我不知道该怎么做。 lambda函数捕获任何异常,因此不应给出任何执行错误。 下面是python中的片段。 我知道lambda应该在“保留”期间重试(默认为24小时),但我希望放弃并最

  • 拒绝/丢弃到反应堆TCPServer的传入连接的正确方法是什么? 我目前有以下资料: 它似乎起作用了,并且成功地从我的列表中的远程地址丢弃连接。但每次它都将堆栈跟踪打印到控制台,而且通常情况下看起来不太好。 拒绝与tcpserver的某些连接的正确方法是什么?

  • 我无法使用 SSL 配置投递向导。 创建密钥/证书如下: 我已经将生成的keystore.jks与我的配置文件(yml)放在一起…我的配置文件具有超文本传输协议条目,如下所示: 已启动服务器..面临异常: 有人可以帮我吗?