优化大量列上的不同值
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,...)更适合?
【讨论】:
以上是关于优化大量列上的不同值的主要内容,如果未能解决你的问题,请参考以下文章