【问题标题】:spark program to find the city with maximum population [duplicate]火花程序找到人口最多的城市[重复]
【发布时间】:2016-11-14 14:33:01
【问题描述】:

输入文件包含如下行(州、城市、人口):

west bengal,kolkata,150000
karnataka,bangalore,200000
karnataka,mangalore,80000
west bengal,bongaon,50000
delhi,new delhi,100000
delhi,gurgaon,200000

我必须用 Python 和 Scala 编写一个 Spark (Apache Spark) 程序才能找到人口最多的城市。输出将是这样的:

west bengal,kolkata,150000
karnataka,bangalore,200000
delhi,new delhi,100000

所以我需要为每个状态提供一个三列输出。我很容易得到这样的输出:

west bengal,15000
karnataka,200000
delhi,100000

但是要让城市拥有最大的人口变得越来越困难。

【问题讨论】:

  • 在问题中包含您已经尝试过的内容(包括代码 sn-ps)总是有帮助的。

标签: apache-spark pyspark bigdata


【解决方案1】:

在 vanilla pyspark 中,将您的数据映射到一对 RDD,其中状态是键,值是元组(城市、人口)。然后reduceByKey 保留最大的城市。请注意,对于人口相同的城市,它将保留遇到的第一个城市。

rdd.map(lambda reg: (reg[0],[reg[1],reg[2]])) .reduceByKey(lambda v1,v2: ( v1 if v1[1] >= v2[1] else v2))

您的数据的结果如下所示:

[('delhi', ['gurgaon', 200000]), ('west bengal', ['kolkata', 150000]), ('karnataka', ['bangalore', 200000])]

【讨论】:

    【解决方案2】:

    这应该可以解决问题:

    >>> sc = spark.sparkContext
    >>> rdd = sc.parallelize([
        ['west bengal','kolkata',150000],
        ['karnataka','bangalore',200000],
        ['karnataka','mangalore',80000],
        ['west bengal','bongaon',50000],
        ['delhi','new delhi',100000],
        ['delhi','gurgaon',200000],
    ])
    
    >>> df = rdd.toDF(['state','city','population'])
    >>> df.show()
    +-----------+---------+----------+
    |      state|     city|population|
    +-----------+---------+----------+
    |west bengal|  kolkata|    150000|
    |  karnataka|bangalore|    200000|
    |  karnataka|mangalore|     80000|
    |west bengal|  bongaon|     50000|
    |      delhi|new delhi|    100000|
    |      delhi|  gurgaon|    200000|
    +-----------+---------+----------+
    
    
    >>> df.groupBy('city').max('population').show()
    +---------+---------------+
    |     city|max(population)|
    +---------+---------------+
    |bangalore|         200000|
    |  kolkata|         150000|
    |  gurgaon|         200000|
    |mangalore|          80000|
    |new delhi|         100000|
    |  bongaon|          50000|
    +---------+---------------+
    
    >>> df.groupBy('state').max('population').show()
    +-----------+---------------+
    |      state|max(population)|
    +-----------+---------------+
    |      delhi|         200000|
    |west bengal|         150000|
    |  karnataka|         200000|
    +-----------+---------------+
    

    【讨论】:

    • 实际上我想要输出的每一行中的三列包含州、最大人口的城市名称和相应的人口。
    猜你喜欢
    • 2016-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-08
    • 2021-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多