package Restartimport java.text.SimpleDateFormat
import java.util.{Calendar, Date}import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}
//查询连续三天登录的用户
object DataOne {def main(args: Array[String]): Unit = {val conf = new SparkConf().setAppName(this.getClass.getCanonicalName).setMaster("local[*]")val sc = new SparkContext(conf)val lines = sc.textFile("C:\\Users\\admin\\Desktop\\data1.txt")val uidAndData: RDD[(String, String)] = lines.map(i => {val strings = i.split(",")val uid = strings(0)val data = strings(1)(uid, data)})val groupUid: RDD[(String, Iterable[String])] = uidAndData.groupByKey()//分组ArrayBuffer((guid01,CompactBuffer(2018-02-28, 2018-03-01, 2018-03-02, 2018-03-04, 2018-03-05, 2018-03-06, 2018-03-07)),// (guid02,CompactBuffer(2018-03-01, 2018-03-02, 2018-03-03, 2018-03-06)))//定义一个index,如果2018-02-28-0 = 2018-03-01-1= 2018-03-02-2......依次类推连续相等3天,就满足条件//本题难点就在于,怎么让时间连续相减val uidAndDate: RDD[(String, (String, String))] = groupUid.flatMapValues(it => {val sorted = it.toSet.toList.sorted //去重,变为数组val sdf = new SimpleDateFormat("yyyy-MM-dd")val calendar = Calendar.getInstance() //获得一个索引var index = 0sorted.map(it => {val date: Date = sdf.parse(it) //将value的时间转为时间戳calendar.setTime(date) //获取时间calendar.add(Calendar.DATE, -index) //时间 负的-index.index += 1(it, sdf.format(calendar.getTime)) //将时间戳,转化为正常时间})})//ArrayBuffer((guid01,(2018-02-28,2018-02-28)), (guid01,(2018-03-01,2018-02-28)), (guid01,(2018-03-02,2018-02-28)), (guid01,(2018-03-04,2018-03-01)), (guid01,(2018-03-05,2018-03-01)), (guid01,(2018-03-06,2018-03-01)), (guid01,(2018-03-07,2018-03-01)),// (guid02,(2018-03-01,2018-03-01)), (guid02,(2018-03-02,2018-03-01)), (guid02,(2018-03-03,2018-03-01)), (guid02,(2018-03-06,2018-03-03)))//如何处理这个时间呢,我们观察,(2018-02-28,2018-02-28) key-0=2018-02-28 没错//2018-03-01 -1=2018-02-28没错,数据是对的那么怎么获取起始时间和结束时间呢//我们将value._2取出来,和guid组成一个元组,在分组,那么只要是连续的就会在一个分区//然后得到---ArrayBuffer(((guid02,2018-03-01),CompactBuffer(2018-03-01, 2018-03-02, 2018-03-03)),// ((guid01,2018-03-01),CompactBuffer(2018-03-04, 2018-03-05, 2018-03-06, 2018-03-07)), // ((guid01,2018-02-28),CompactBuffer(2018-02-28, 2018-03-01, 2018-03-02)),// ((guid02,2018-03-03),CompactBuffer(2018-03-06)))//我们对value进行处理,value.head就是起始时间,last结束时间,size是连续几天//处理后的结果//ArrayBuffer(((guid02,2018-03-01),(3,2018-03-01,2018-03-03)), ((guid01,2018-03-01),(4,2018-03-04,2018-03-07)), ((guid01,2018-02-28),(3,2018-02-28,2018-03-02)), ((guid02,2018-03-03),(1,2018-03-06,2018-03-06)))//余下的工作只需要map将uid和起始时间,结束时间连续天数进行过滤就可以得到需求val value: RDD[(String, String, String, Int)] = uidAndDate.map(it => ((it._1, it._2._2), it._2._1)).groupByKey().mapValues(it => {val sorted = it.toList.sortedval head = sorted.headval last = sorted.lastval size = sorted.size(head, last, size)}).filter(i=>i._2._3>=3).map(it => {(it._1._1, it._2._1, it._2._2, it._2._3)})
//ArrayBuffer((guid02,2018-03-01,2018-03-03,3), (guid01,2018-03-04,2018-03-07,4), (guid01,2018-02-28,2018-03-02,3))println(uidAndDate.collect().toBuffer)
sc.stop()}}
详细解决方案
Spark:连续三天登录的用户
热度:53 发布时间:2024-02-10 22:50:03.0
相关解决方案
- spark + openfire的聊天监控有关问题
- spark Jpanel 组件格局
- 有关问题,Openfire+Spark+Redfire严重有关问题
- spark+smack+openfire工作原理,苦闷啊
- 高仿QQ源码下载 (android前端+JAVA后台+spark<windows版聊天>)便利集成到自己系统
- Spark修炼之道(进阶篇)——Spark入门到精通:第九节 Spark SQL运作流程解析
- spark sql 创设dataframes
- spark札记2-spark-sql 程序
- 【Spark105】Spark SQL动态代码生成1
- 【Spark107】Spark SQL动态代码生成3
- 【Spark108】Spark SQL动态代码生成4
- 如何在加载到 Spark 数据帧之前预处理 JSON 数据
- Spark:在Scala中与ListBuffer一起使用cogroup时出现内存问题(超出了GC开销限制)
- Spark 1.4.0 org.apache.spark.sql.AnalysisException:无法解析给定输入列的“概率”
- Windows环境上的Apache Spark:spark.eventLog.dir
- Java-Spark:如何获取数据集
在循环中迭代时的列值,并在when()。otherwise()中使用它?
- Spark / Java:不可序列化问题-Kryo序列化
- Spark 中join一定产生shuffle吗?
- spark 将dataframe数据写入Hive分区表
- spark.driver.maxResultSize参数详解
- Spark SQL中将 DataFrame 转为 json 格式
- Spark 持久化(cache和persist的区别)
- spark sql优化:小表大表关联优化 union替换or broadcast join
- spark dataframe新增一列的四种方法
- spark 的createDstream和createDirectStream区别
- spark foreach println 无显示
- Spark Datafream如何将Column.isin与List使用(判断column中的值是否在List中)--filter(Column.isin(List))
- Spark core 04(调优)
- spark 在yarn执行job时一直报0.0.0.0:8030错误
- spark-streaming连接hive+HBase