目录
任务描述
本关任务:编写一个能用 Flink 获得数据并输出的小程序。
相关知识
为了完成本关任务,你需要掌握:如何用 Flink 获得数据并输出。
解析数据源
先来看看数据的内容和格式,
每一行表示一个用户行为, 这些数据保存在 UserBehavior1.csv 文件中, 如以下两条数据:
543462,1715,1464116,pv,1511658000
662867,2244074,1575622,pv,1511658000
解释如下: 543462(用户id),1715(商品id),1464116(商品类目id),pv(行为类型),1511658000(时间戳),
注意,这个时间戳的单位是秒。
数据格式如下表:
用户id | 商品id | 商品类目id | 行为类型 | 时间戳 |
---|---|---|---|---|
543462 | 1715 | 1464116 | pv | 1511658000 |
按逗号进行分隔。
将数据封装到样例类并输出
代码如下:
// 输入数据的样例类,对应数据中的用户id、类别id、行为方式,
// 分别是第1、3、4列数据
//样例类要定义在 object 之外
case class UserBehavior1( userId: Long, categoryId: Int, behavior: String)
object LiLun1 {
def main(args: Array[String]): Unit = {
//flink的流执行环境
val env = StreamExecutionEnvironment.getExecutionEnvironment
//设定Time类型为EventTime
env.setStreamTimeCharacteristic(TimeCharacteristic.EventTime)
//并发为1
env.setParallelism(1)
//获得数据源的文件
val stream = env.readFile[String](
new TextInputFormat(null),
"D:\\MyProjects\\UserBehaviorAnalysis\\HotItemsAnalysis\\src\\main\\resources\\UserBehavior1.csv")
//获得文件中的相应的记录,并且封装到样例类中
val stream1=stream
.map(line => {
val linearray = line.split(",")
// 将数据保存到样例例UserBehavior1中,对应数据中的用户id、类别id、行为方式,
// 分别是第1、3、4列数据,
// 注意,要将数据转换成为样例类相应属性的数据类型,
// 如果是String类型的不用转换,因为默认就是String类型
UserBehavior1( linearray(0).toLong, linearray(2).toInt, linearray(3))
})
//输出数据
stream1.print()
env.execute("数据封装到样例类并输出")
}
}
输出结果: UserBehavior1(543462,1464116,pv)
UserBehavior1(662867,1575622,pv)
编程要求
根据提示,在右侧编辑器补充代码,获得数据并输出, 样例类为:
case class UserBehavior( userId: Long, itemId: Long, categoryId: Int, behavior: String, timestamp: Long )
对应如下数据内容:
543462,1715,1464116,pv,1511658000
662867,2244074,1575622,pv,1511658000
数据解析参考之前的“解析数据源”
测试说明
平台会对你编写的代码进行测试:
测试输入:电商数据日志文件; 预期输出: UserBehavior(543462,1715,1464116,pv,1511658000)
UserBehavior(662867,2244074,1575622,pv,1511658000)
参考答案
import org.apache.flink.api.java.io.TextInputFormat
import org.apache.flink.streaming.api.TimeCharacteristic
import org.apache.flink.streaming.api.scala._
//输入数据的样例类
case class UserBehavior( userId: Long, itemId: Long, categoryId: Int, behavior: String, timestamp: Long )
object Test1 {
def main(args: Array[String]): Unit = {
//flink的流执行环境
val env = StreamExecutionEnvironment.getExecutionEnvironment
//设定Time类型为EventTime
env.setStreamTimeCharacteristic(TimeCharacteristic.EventTime)
//并发为1
env.setParallelism(1)
//获得数据源的文件
val stream = env.readFile[String](
new TextInputFormat(null),
"/data/workspace/myshixun/pflinkhotitems1_2/src/UserBehavior1.csv")
//********** Begin **********
val stream1 = stream
.map(line => {
val lineArray = line.split(",")
// 将行数据转换为UserBehavior对象
UserBehavior(lineArray(0).toLong, lineArray(1).toLong, lineArray(2).toInt, lineArray(3), lineArray(4).toLong)
})
//********** End **********
stream1.writeAsText("/root/files/result.txt").setParallelism(1)
env.execute("获得数据")
}
}