flink scala案例类

jgzswidk  于 2021-06-26  发布在  Flink
关注(0)|答案(2)|浏览(668)

我想知道如何用case类的字段名替换x.\u 1.\u 2,x.\u 1.\u 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)
8yparm6h

8yparm6h1#

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

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

r7s23pms

r7s23pms2#

模式匹配确实是一个好主意,可以使代码更具可读性。要回答您的问题,要使keyuid函数返回case类,首先需要定义它,例如:
case类click(stringuid,long timestamp,stringip)
而不是 return (uid,timestamp,ip) 你需要做什么 return Click(uid,timestamp,ip) case类与flink无关,但与scala有关:https://docs.scala-lang.org/tour/case-classes.html

相关问题