如何使用approx_count_destict对Spark DataFrame中两列的不同组合进行计数



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

我搜索了";如何将CCD_ 5与CCD_;并找到了这个答案。然而,那里提出的解决方案(类似于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()处理多个列,并计算这些列的不同组合?如果没有,是否有其他函数可以做到这一点?它的示例用法是什么?

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

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

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

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

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

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

最新更新