pyspark-如何简化bykey以仅获取元组中一个元素的最小值
假设csv文件中有以下数据(站点代码、日期、数据类型、温度): ‘ITE0100554’、‘18000101’、‘TMIN’、-7.5 ‘ITE0100554’、‘18000101’、‘TMIN’、-14.8 ‘ITE0100554’、‘18000102’、‘TMIN’、-7.5 ‘ITE0100554’、‘18000102’、‘TMIN’、-14.9 我试着找出最小温度和相应的日期。答案应该是:'ITE0100554','18000102','TMIN',-14.9 这是我的密码:pyspark-如何简化bykey以仅获取元组中一个元素的最小值,pyspark,Pyspark,假设csv文件中有以下数据(站点代码、日期、数据类型、温度): ‘ITE0100554’、‘18000101’、‘TMIN’、-7.5 ‘ITE0100554’、‘18000101’、‘TMIN’、-14.8 ‘ITE0100554’、‘18000102’、‘TMIN’、-7.5 ‘ITE0100554’、‘18000102’、‘TMIN’、-14.9 我试着找出最小温度和相应的日期。答案应该是:'ITE0100554','18000102','TMIN',-14.9 这是我的密码: from
from pyspark import SparkConf, SparkContext
conf = SparkConf().setMaster("local").setAppName("MinTempDate")
sc = SparkContext(conf = conf)
# parsing (mapping) the input data
def parseLine(line):
fields = line.split(',')
stationID = fields[0]
date = fields[1]
entryType = fields[2]
temperature = float(fields[3])
# creates key/value pairs
return (stationID, date, entryType, temperature)
lines = sc.textFile("1800.csv")
parsedLines = lines.map(parseLine)
minTemps = parsedLines.filter(lambda x: "TMIN" in x[2])
stationTemps = minTemps.map(lambda x: (x[0], (x[1], x[3])))
minTemps = stationTemps.reduceByKey(lambda x, y: (if x[1] >= y[1] y[0] else x[0],min(x[1], y[1])))
我的问题是最后一行中的reduceByKey,因为语法不正确,我不知道如何确保我得到了最低温度和相应的日期
如果我这样做:
minTemps = stationTemps.reduceByKey(lambda x, y: min(x, y))
它不起作用,因为它将返回元组的最小值,这意味着:
‘ITE0100554’、‘18000101’、‘TMIN’、-14.8
这不是我要找的
这篇文章非常接近我想要的内容,但是我不知道如何更改语法以使其正常工作:
将lambda as中if子句的语法更改为
minTemps = stationTemps.reduceByKey(lambda x, y: (y[0] if x[1] >= y[1] else x[0],min(x[1],y[1])))
请描述您的更改,为什么以及如何解决此问题。这些差异并不那么引人注目。
from pyspark import SparkConf, SparkContext
conf = SparkConf().setMaster("local").setAppName("MinTemperatures")
sc = SparkContext(conf = conf)
def parseLine(line):
fields = line.split(',')
stationID = fields[0]
entryType = fields[2]
temperature = float(fields[3])
return (stationID, entryType, temperature)
lines = sc.textFile("hdfs://..../1800.csv")
parsedLines = lines.map(parseLine)
minTemps = parsedLines.filter(lambda x: "TMIN" in x[1])
stationTemps = minTemps.map(lambda x: (x[0], x[2]))
miniTemps = stationTemps.reduceByKey(lambda x, y: min(x,y))
results = miniTemps.collect()
for result in results:
print("Station Id: {0} \n Min Temp: {1}".format(result[0], result[1]))
Output:
Station Id: ITE00100554
Min Temp: -148.0
Station Id: EZE00100082
Min Temp: -135.0