【问题标题】:How to use approx_count_distinct to count distinct combinations of two columns in a Spark DataFrame?如何使用 approx_count_distinct 计算 Spark DataFrame 中两列的不同组合?
【发布时间】:2021-09-25 15:52:16
【问题描述】:

我有一个 Spark DataFrame (sdf),其中每一行显示一个 IP 访问一个 URL。我想在这个数据框中计算不同的 IP-URL 对,最直接的解决方案是 sdf.groupBy("ip", "url").count()。然而,由于数据帧有数十亿行,精确计数可能需要相当长的时间。我对 PySpark 不是特别熟悉——我尝试将 .count() 替换为 .approx_count_distinct(),这在语法上是不正确的。

我搜索了“如何使用.approx_count_distinct()groupBy()”并找到this answer。但是,那里建议的解决方案(类似于这些方面:sdf.groupby(["ip", "url"]).agg(F.approx_count_distinct(sdf.url).alias("distinct_count")))似乎并没有给我想要的计数。 .approx_count_distinct() 方法不能将两列作为参数,所以我也不能写 sdf.agg(F.approx_count_distinct(sdf.ip, sdf.url).alias("distinct_count"))

我的问题是,有没有办法让.approx_count_distinct() 处理多个列并计算这些列的不同组合?如果没有,是否还有其他功能可以做到这一点?它的示例用法是什么?

非常感谢您提前提供的帮助!

【问题讨论】:

    标签: python sql apache-spark pyspark apache-spark-sql


    【解决方案1】:

    根据需要使用表达式和别名进行分组。让我们试试:

    df.groupBy("ip", "url").agg(expr("approx_count_distinct(ip)").alias('ip_count'),expr("approx_count_distinct(url)").alias('url_count')).show()
    

    【讨论】:

      【解决方案2】:

      您的代码sdf.groupby(["ip", "url"]).agg(F.approx_count_distinct(sdf.url).alias("distinct_count")) 将为每个组赋予值 1,因为您正在计算一个分组列的值; 网址

      如果您想使用 approx_count_distinct 函数计算不同的 IP-URL 对,您可以将它们组合在一个数组中,然后应用该函数。应该是这样的

      sdf.selectExpr("approx_count_distinct(array(ip, url)) as distinct_count")
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-04-14
        • 2019-01-04
        • 2016-07-28
        • 1970-01-01
        • 2022-11-11
        • 1970-01-01
        • 1970-01-01
        • 2019-03-16
        相关资源
        最近更新 更多