如何用Spark SQL/DataFrame实现Pandas nunique 单句查询全列唯一值计数
Spark 实现全列唯一值计数(对标Pandas nunique)
实现方案
方式1:DataFrame API 实现
无需手动逐个指定列名,动态遍历所有字段生成聚合逻辑:
import org.apache.spark.sql.functions.countDistinct // 单条agg语句完成全列唯一值计数 val nuniqueResult = df.agg( df.columns.map(colName => countDistinct(colName).alias(s"nunique_${colName}")): _* ) // 输出结果 nuniqueResult.show(false)
方式2:纯Spark SQL 实现
先注册临时视图后,动态拼接SQL语句执行:
// 注册数据为临时视图 df.createOrReplaceTempView("youtube_videos") // 生成并执行单条查询SQL val nuniqueSql = s""" SELECT ${df.columns.map(col => s"COUNT(DISTINCT ${col}) AS nunique_${col}").mkString(", ")} FROM youtube_videos """ val nuniqueResult = spark.sql(nuniqueSql) // 输出结果 nuniqueResult.show(false)
可选优化
如果你的数据量很大,可接受近似计数结果,可以把countDistinct替换为approx_count_distinct,能大幅提升计算性能,误差通常在2%以内。
内容的提问来源于stack exchange,提问作者joesan
相关产品推荐
相关产品推荐

