spark处理hive数据排序问题

新入坑数据挖掘,从一段spark入门级数据处理代码开始。
涉及语言Scala、Sql,并涉及将DataFrame转换为Rdd,实现的是从hive读取数据,并根据字段进行分组排序的功能,代码如下:

val df_sr = spark.sql(s"""
SELECT  
    pushConfigId, 
    updated
FROM default.ods_flow_rye_PushScene_$YTD()
   limit 1000
""")
val df = df_sr.rdd.map(r=>(r(0),r(1)))
val groups=df.groupByKey();
val groupsSort=groups.map(tu=>{
    val key=tu._1
    val values=tu._2
    val sortValues=values.toList.sortWith(_.asInstanceOf[Long] > _.asInstanceOf[Long])
    (key,sortValues)
})
groupsSort.collect.foreach(value=>{
print(value._1);
value._2.foreach(v=>print("\t"+v));
println()
})

其中spark.sql使我们可以直接使用sql语句查询数据库数据,并将数据一DataFrame(数据框)形式呈现,如上代码仅仅查询了两个字段,根据 pushConfigId进行分组,然后对updated排序取top4数据;

其中df_sr.rdd.map(r=>(r(0),r(1))),实现了DataFrame转换为RDD(弹性分布式数据集)的操作,map()将函数用于RDD中的每个元素,将返回值构成新的RDD即df,以键值对形式呈现,groupsdf的按键分组后的结果,groupsSort中通过map函数对groups中的每个“值”组进行排序;

其中代码运行过程中并不知道具体数据类型,通过groups.collect获得的结果为res0: Array[(Any, Iterable[Any])] = Array((100074,CompactBuffer(1544602338)), (100194,CompactBuffer(1546933088)),Any为scala数据类型,是所有其他类的超类,因此需要给每个值指定一个具体的数据类型,并在实现过程中时刻注意,本实例中排序具体为sortWith(_.asInstanceOf[Long] > _.asInstanceOf[Long]),然后groupsSort.collect.foreach()遍历输出结果。
提示:如果没有.collect即使有println()也不会显示结果但也不报错。

你可能感兴趣的:(大数据/云计算,数据处理)