当前位置: 首页 > 知识库问答 >
问题:

PySpark--查找具有1个以上distinct值的DataFrame列的有效方法

阎祖鹤
2023-03-14
counts = df.summary("count").collect()[0].asDict()
null_cols = [c for c in counts.keys() if counts[c] == '0']
df2 = df.drop(*null_cols)

我目前拥有以下内容(使用我从上面的代码片段中获得的DF2):

prox_counts = (df2.agg(*(F.approx_count_distinct(F.col(c)).alias(c)
                         for c in df2.columns
                         )
                       )
                  .collect()[0].asDict()
               )
poss_unarcols = [k for k in prox_counts.keys() if prox_counts[k] < 3]
unar_cols = [c for c in poss_unarcols if df2.select(c).distinct().count() < 2]

基本上,我首先以快速但近似的方式找到可以是一元的列,然后更详细地、更慢地查看“候选”。

我不喜欢它的一点是:a)即使使用近似预选,它仍然相当慢,运行需要一分钟,尽管此时我只有大约70列(大约600万行);b)我使用approx_count_distinct和神奇的常量3(approx_count_distinct不计数null,因此3而不是2)。由于我不确定approx_count_distinct在内部是如何工作的,所以我有点担心3不是一个特别好的常量,因为该函数可能会估计distinct(non-null)值的数量,比如当它实际上是1时为5,因此可能需要一个更高的常量来保证候选列表oss_unarcols中没有丢失任何东西。

是否有一种更聪明的方法来实现这一点,理想情况下,这样我甚至不必单独删除null列,而是一次性地完成所有操作(尽管这实际上相当快,所以这是一个大问题)?

共有1个答案

范建华
2023-03-14

我建议您看一下下面的函数

pyspark.sql.functions.collect_set(col)

https://spark.apache.org/docs/latest/api/python/pyspark.sql.html?highlight=dataframe

它将返回col中的所有值,并消除乘法元素。然后可以检查结果的长度(是否等于1)。我想知道性能,但我认为它肯定会超过distinct()。count()。周一让我们看看:)

 类似资料:
  • 问题内容: 我有一个很大的数据集,我想删除包含值的列并返回一个新的数据框。我怎样才能做到这一点? 以下内容仅删除包含的单个列或行。 例如 在上述情况下,它将丢弃整个列,因为其值之一为空。 问题答案: 这是删除所有具有NULL值的所有列的一种可能的方法,以获取每列NULL值计数代码的源代码。 之前: 后: 希望这可以帮助!

  • 问题内容: 每个“产品”最多可以有10000个“细分”行。这些细分受众群具有一个针对每种产品(1、2、3、4、5,…)从1开始的排序列,以及一个值列,该列可以包含诸如(323.113、5423.231、873.42、422.64、763.1,…)。 我想确定给定细分子集的产品的潜在匹配。例如,如果我按正确的顺序有5个细分值,那么如何在细分表中某处有效地找到所有具有相同顺序的5个细分的所有产品? 问

  • 问题内容: 在[成员]表中,某些行的列值相同。 有些人使用了不同的login_id,但是使用了相同的电子邮件地址,因此在此列上未设置唯一约束。现在,我需要查找这些行,并查看是否应将其删除。 我应该使用什么SQL语句查找这些行?(MySQL 5) 问题答案: 此查询将为您提供电子邮件地址及其使用次数的列表,最常用的地址在前。 如果要完整行:

  • 假设我有一个如下所示的数据框,我需要识别每行,其中一个或多个缺失值 (NA) 后跟至少一个有效值(任何数字)。你可以帮我吗?

  • 问题内容: 我有这样的桌子 我想获得具有相同发明编号的订单数量总和 那就是想要这样的结果 我们如何编写mysql查询 问题答案: 利用聚合函数并根据进行分组。 GROUP BY子句

  • 这里我试图用jpa从mysql数据库中获取数据,但是我被findby绊倒了,如何使用Crudepository spring数据jpa为下面的查询编写findby方法? 我试过这个,但它不工作: 我有这样的实体类: