统计出每一个省份每个广告被点击数量排行的 Top3
package Task
import org.apache.spark.{SparkConf, SparkContext}
object RDD_Req {
def main(args: Array[String]): Unit = {
val SparkConf = new SparkConf().setAppName("Req").setMaster("local[*]")
val context = new SparkContext(SparkConf)
// 读取文件
val rdd = context.textFile("data/agent.log")
// 转换和映射
val mapRDD = rdd.map({
line => {
val datas = line.split(" ")
((datas(1), datas(4)), 1)
}
})
// 聚合
val reduceRDD = mapRDD.reduceByKey(_ + _)
// 重新分组聚合
val newMapRDD = reduceRDD.map {
case ((sf, ad), sum) => (sf, (ad, sum))
}
val groupRDD = newMapRDD.groupByKey()
// 排序
val result = groupRDD.mapValues(
iter => {
iter.toList.sortBy(_._2)(Ordering.Int.reverse).take(3)
}
)
// 收集并打印结果
result.collect().foreach(println)
}
}
使用自定义分区器按要求将数据分区
package Task
import org.apache.spark.{SparkConf, SparkContext}
object CustomPartitioningExample {
def main(args: Array[String]): Unit = {
val conf = new SparkConf().setAppName("CustomPartitioningExample").setMaster("local[*]")
val sc = new SparkContext(conf)
val inputFile = "/Users/hacker/Documents/Spark大数据处理技术/spark_core/data/data.txt" // 替换为你的文件路径
val dataRDD = sc.textFile(inputFile)
// 自定义分区函数,为每个元素添加一个分区键
val partitionedData = dataRDD.map(line => {
val partitionKey = line.headOption.map { c =>
if (Character.isDigit(c)) 0
else if (Character.isLowerCase(c)) 1
else if (Character.isUpperCase(c)) 2
else 3
}.getOrElse(3) // 如果没有元素(空行),默认为3
(partitionKey, line) // 返回一个(partitionKey, line)对
})
// 根据分区键重新分区数据(这里假设我们想要4个分区)
val repartitionedData = partitionedData.repartition(4)
// 你现在可以基于分区键处理数据
// 例如,你可以将每个分区的数据写入不同的文件
repartitionedData.mapPartitionsWithIndex((index, iter) => {
val partitionData = iter.map(_._2) // 只需要行数据,不需要分区键
// 这里只是打印分区索引和行数据,实际情况下你可以进行其他操作
partitionData.foreach(line => println(s"Partition $index: $line"))
iter // 返回迭代器,如果后续还有操作
}).count() // 触发计算
sc.stop()
}
}