【问题标题】:Flink scala Case classFlink scala 案例类
【发布时间】:2020-07-08 00:51:30
【问题描述】:

我想知道如何使用 case class 将 x._1._2, x._1._3 替换为字段的名称

def keyuid(l:Array[String]) : (String,Long,String) ={
  //val l=s.split(",")
  val ip=l(3).split(":")(1)
  val values=Array("",0,0,0)
  val uid=l(1).split(":")(1)
  val timestamp=l(2).split(":")(1).toLong*1000
  val impression=l(4).split(":")(1)
  return (uid,timestamp,ip)
}

val cli_ip = click.map(_.split(","))
  .map(x => (keyuid(x), 1.0)).assignAscendingTimestamps(x=>x._1._2)
  .keyBy(x => x._1._3)
  .timeWindow(Time.seconds(10))
  .sum(1)

【问题讨论】:

  • 你的意思是元组 (String, Long, String) 吗?我在这里真的看不到一些案例类
  • 其实我想让代码更具可读性,所以我想用字段的名称替换 x._1._2 和 x._1._3(在我的情况下为 ip)。函数 keyuid 是否可以返回案例类?
  • 知道了。是的,您可以将所有三个字段打包到您定义的案例类中。

标签: scala class apache-flink


【解决方案1】:

在使用花括号和case 关键字编写 lambda 函数时使用 Scala 模式匹配。

val cli_ip = click.map(_.split(","))
  .map(x => (keyuid(x), 1.0)).assignAscendingTimestamps { 
    case ((_, timestamp, _), _) => timestamp 
  }
  .keyBy { elem => elem match {
      case ((_, _, ip), _) => ip
    }
  }
  .timeWindow(Time.seconds(10))
  .sum(1)

在此处了解有关元组及其模式匹配语法的更多信息:https://docs.scala-lang.org/tour/tuples.html

【讨论】:

  • 非常感谢,但是我遇到了一个问题“无法解析重载方法'keyBy'”。
  • 你是对的。 keyBy 组合器有点棘手,并且有几个重载选项。我已将模式匹配子句添加到 lambda 正文中。请参阅上面的更新。
【解决方案2】:

模式匹配确实是一个好主意,并且使代码更具可读性。 要回答您的问题,要使 keyuid 函数返回一个案例类,您首先需要定义它,例如:

案例类点击(字符串uid,长时间戳,字符串ip)

那么你需要return Click(uid,timestamp,ip)而不是return (uid,timestamp,ip)

案例类与 flink 无关,但与 scala 相关:https://docs.scala-lang.org/tour/case-classes.html

【讨论】:

    猜你喜欢
    • 2017-09-29
    • 2019-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多