面試分享(spark 實現每天訪問的記錄數和用戶數)

最近收到一家公司面試題感悟:
要求:用戶訪問日誌文件有兩列,分別爲日期和用戶ID :(date,user_id) 使用spark 統計每天訪問記錄數和用戶數。

1、每天訪問記錄數例子完成
在這裏插入圖片描述
結果

(2017-01-03,4)
(2017-01-02,3)
(2017-01-01,3)

每天訪問的用戶數(當時沒有太理解)估計面試官想問新增用戶數
具體實現結果爲:
在這裏插入圖片描述
實現思想 是一個倒排的思想
1、找到 每個用戶對應 日期 即 rdd1.map(kv=>(kv._2,kv._1))
2、對每個用戶groupyby
3、找到 每個用戶的最早訪問時間明細(細節是每個用戶時間後置1) 即rdd3.map(kv => (kv._2.min, 1))
4、用countBykey 對時間出現次數進行統計合併。

思路參考:https://blog.csdn.net/dkl12/article/details/80256688
結果爲
(2017-01-03,3)
(2017-01-02,1)
(2017-01-01,3)

具體代碼爲:

import org.apache.spark.sql.SparkSession

object Test {
  def main(args: Array[String]): Unit = {
    val spark = SparkSession.builder().appName("NewUVDemo").master("local").getOrCreate()
    val rdd1 = spark.sparkContext.parallelize(
      Array(
        ("2017-01-01", "a"), ("2017-01-01", "b"), ("2017-01-01", "c"),
        ("2017-01-02", "a"), ("2017-01-02", "b"), ("2017-01-02", "d"),
        ("2017-01-03", "b"), ("2017-01-03", "e"), ("2017-01-03", "f"),("2017-01-03", "g")))
    //倒排

//    val rdd2 = rdd1.groupByKey().map(t=>(t._1,t._2.size))
//    rdd2.foreach(println)

    val rdd2 = rdd1.map(kv => (kv._2, kv._1))
    //倒排後的key分組
    val rdd3 = rdd2.groupByKey()
    //取最小時間
    val rdd4 = rdd3.map(kv => (kv._2.min, 1))
    rdd4.countByKey().foreach(println)
  }

}

注意:失誤點當時很久沒用groupyBykey 不熟練

reduceByKey和groupByKey區別與用法

(1)reduceByKey(func, numPartitions=None)
reduceByKey用於對每個key對應的多個value進行merge操作,最重要的是它能夠在本地先進行merge操作,並且merge操作可以通過函數自定義。一般的化 如 reduceBykey(+)
(2)groupByKey(numPartitions=None)
也就是,groupByKey也是對每個key進行操作,**但只生成一個sequence。**需要特別注意“Note”中的話,它告訴我們:如果需要對sequence進行aggregation操作(注意,groupByKey本身不能自定義操作函數),那麼,選擇reduceByKey/aggregateByKey更好。這是因爲groupByKey不能自定義函數,我們需要先用groupByKey生成RDD,然後才能對此RDD通過map進行自定義函數操作。

兩種方法應用的區別爲:
val words = Array(“one”, “two”, “two”, “three”, “three”, “three”)
val wordPairsRDD = sc.parallelize(words).map(word => (word, 1))
val wordCountsWithReduce = wordPairsRDD.reduceByKey(_ + _)
val wordCountsWithGroup = wordPairsRDD.groupByKey().map(t => (t._1, t._2.sum))

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章