在PySpark

时间:2016-12-14 09:33:49

标签: apache-spark pyspark

我正在使用PySpark处理温度预测数据。

原始温度数据采用以下格式:

station;date;time,temperature;quality
102170;2012-11-01;06:00:00;6.8;G
102185;2012-11-02;06:00:00;5.8;G
102170;2013-11-01;18:00:00;2.8;G
102185;2013-11-01;18:00:00;7.8;G

目标结果是获取每年的最低/最高温度,如下所示:

year;station;max_temp
2013;102185;7.8
2012;102170;6.8

我目前的代码如下:

sc = SparkContext(appName="maxMin")
lines = sc.textFile('data/temperature-readings.csv')
lines = lines.map(lambda a: a.split(";"))
lines = lines.filter(lambda x: int(x[1][0:4]) >= 1950 and int(x[1][0:4]) <= 2014)
temperatures = lines.map(lambda x: (x[1][0:4], (x[0], float(x[3]))))

到目前为止,结果如下:

temperatures.take(4)

(2012, (102170,6.8))
(2012, (102185,5.8))
(2013, (102170,2.8))
(2013, (102185,7.8))

按键分组后,变为如下:

temperatures = temperatures.groupByKey()
temperatures.take(2)

[(u'2012', <pyspark.resultiterable.ResultIterable object at 0x2a0be50>), 
(u'2013', <pyspark.resultiterable.ResultIterable object at 0x2a0bc50>)]

那么,我如何减少这些可结果对象以仅获得具有最小或最大温度的元素。

1 个答案:

答案 0 :(得分:3)

请不要。按键使用reduce:

lines.map(lambda x: (x[1][0:4], (x[0], float(x[3])))).map(lambda x: (x, x)) \
    .reduceByKey(lambda x, y: (
        min(x[0], y[0], key=lambda x: x[1]), 
        max(x[1], y[1], , key=lambda x: x[1])))