在Pyspark中独立地从多个列中高效查找前N个值

时间:2019-08-11 21:59:35

标签: apache-spark pyspark rdd

我正在尝试获取数据帧中所有列的前n个频率计数

counts = (df.rdd
    .flatMap(lambda x: x.asDict().items())
    .map(lambda x: (x, 1))
    .reduceByKey(add))

我得到这个: (((列名/值),计数)

(('name', 'Dominion Range 08357'), 1)
(('id', 52132), 1)
(('nametype', 'Valid'), 10)
(('recclass', 'L6'), 2)
(('mass (g)', 8.9), 1)
(('fall', 'Found'), 10)
(('year', '01/01/2008 12:00:00 AM'), 2)
(('reclat', 0.0), 1)
(('reclong', 0.0), 1)
(('GeoLocation', '(0.000000, 0.000000)'), 1)
(('name', 'Yamato 792863'), 1)
(('id', 28212), 1)
(('recclass', 'H5'), 3)
(('mass (g)', 132.25), 1)
(('year', '01/01/1979 12:00:00 AM'), 1)
(('reclat', -71.5), 1)
(('reclong', 35.66667), 1)
(('GeoLocation', '(-71.500000, 35.666670)'), 1)

之后,我尝试获取前10个值:

(counts
    .groupBy(lambda x: x[0])
    .flatMap(lambda g: nlargest(10, g[1], key=lambda x: x[1])))

但是我得到了相同的结果。 有帮助吗?

1 个答案:

答案 0 :(得分:0)

我只是弄清楚了。我失踪了,在groupBy

中有多余的索引
counts = (df.rdd
    .flatMap(lambda x: x.asDict().items())
    .map(lambda x: (x, 1))
    .reduceByKey(add)
    .groupBy(lambda x: x[0][0])
    .flatMap(lambda g: nlargest(3, g[1], key=lambda x: x[1])))