优化大量列上的不同值

时间:2018-05-21 21:54:53

标签: python pyspark bigdata pyspark-sql

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

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

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

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

2 个答案:

答案 0 :(得分:1)

(更新) 不确定,它足够快但你可能想尝试

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

答案 1 :(得分:0)

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

  1. 修改您的模型。所有列都是独立的吗?是否许多这些列只代表相同维度的不同值?那么你可以基本上减少列数。

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