优化大量列上的不同值

Posted

技术标签:

【中文标题】优化大量列上的不同值【英文标题】:Optimize distinct values on a large number of columns 【发布时间】:2018-05-21 21:54:52 【问题描述】:

我需要计算大量列 (>20,000) 的不同值。我现在使用 pyspark.sql.functions.approxCountDistinct() 来获得每列不同计数的近似值。那是超级快(HyperLogLog)。之后,如果不同的计数低于某个阈值(如 10),我们需要这些值。我有一个循环可以做到这一点。

distinct_values_list[cname] = df.select(cname).distinct().collect()

大多数时候它非常慢,我有很多列要处理,可能是列的一半(10K)。有没有办法让 spark 一次做很多列?似乎它只会并行化每一列,但不能一次处理多列。

感谢我能得到的任何帮助。

【问题讨论】:

你的表有多少行? 【参考方案1】:

(更新) 不确定,速度够快,但你可能想试试

import pyspark.sql.functions as F
df.select(*[
    F.collect_set(c).alias(c)
    for c in LIST_10k_COLS
]).collect()

【讨论】:

这种方法行不通,因为每列将有不同数量的不同值,因此每列返回的维度会有所不同。如果有某种方法可以告诉数据框只用一些 NULL 值填充缺失值,那将是理想的,但我不知道是否有办法。希望我说得通。 更新了我的答案【参考方案2】:

假设每列中只有 2 个值。那么唯一组合的数量是 2^20000 =~ 10^7000。这是 1,有 7000 个零。如果某些列中的值超过 2 个,这个数字会更高。

    修改您的模型。所有列真的独立吗?难道这些列中的许多只代表同一维度的不同值吗?那么可能你可以从本质上减少列数。

    考虑您是否使用了正确的工具。可能有一些完全不同的方法(Neo4j,...)更适合?

【讨论】:

以上是关于优化大量列上的不同值的主要内容,如果未能解决你的问题,请参考以下文章

数据量太大,分页查询变慢,有啥优化查询的方法吗

SQL - 计算不同列上的重复次数

相同列上的 Oracle 2 索引但顺序不同

熊猫合并:合并同一列上的两个数据框,但保留不同的列

Pandas Groupby:同一列上的聚合,但总计基于两个不同的标准/数据框

如何在不同列上的名字和姓氏的不同行上搜索多个名称?