Spark SQL 优化 count distinct

org.apache.spark.sql.functionscountDistinct 方法,可用于统计分组内不同值的数据

以统计页面的 PV 和 UV为例:

// accessLogDF 页面的访问日志
accessLogDF.groupBy(accessLogDF("page_id")).agg(  
    count("user_id") as "pv",
    countDistinct("user_id") as "uv"
)

在 Spark 2.0 之后,Apache Spark SQL 提供了基于 HyperLogLog 算法的 approx_count_distinct 方法

以上面统计页面的 PV 和 UV 为例,如果 UV 的值准确性要求不那么高,那么优化后的代码:

// accessLogDF 页面的访问日志
accessLogDF.groupBy(accessLogDF("page_id")).agg(  
    count("user_id") as "pv",
    approx_count_distinct("user_id") as "uv"
)

参考:https://databricks.com/blog/2016/05/19/approximate-algorithms-in-apache-spark-hyperloglog-and-quantiles.html