2016-12-17 3 views
3

У меня есть следующие dataframe с двумя первой строки выглядит как:Каков наиболее эффективный способ в pyspark для сокращения данных?

['station_id', 'country', 'temperature', 'time'] 
['12', 'usa', '22', '12:04:14'] 

Я хочу, чтобы отобразить среднюю температуру порядка 100 первых станций в «Франция» по убыванию.

Каков наилучший способ (наиболее эффективный) сделать это в pyspark?

+1

Что вы пробовали, кажется, '' filter', map' , 'reduceByKey' и' sortBy' будут работать. – AChampion

+0

Вы имеете в виду заголовки столбцов и первую строку? – mtoto

+0

Да, первый - это заголовок колонки – mel

ответ

3

Мы переводим ваш запрос Spark SQL следующим образом:

from pyspark.sql.functions import mean, desc 

df.filter(df["country"] == "france") \ # only french stations 
    .groupBy("station_id") \ # by station 
    .agg(mean("temperature").alias("average_temp")) \ # calculate average 
    .orderBy(desc("average_temp")) \ # order by average 
    .take(100) # return first 100 rows 

Использование RDD API и анонимные функции:

df.rdd \ 
    .filter(lambda x: x[1] == "france") \ # only french stations 
    .map(lambda x: (x[0], x[2])) \ # select station & temp 
    .mapValues(lambda x: (x, 1)) \ # generate count 
    .reduceByKey(lambda x, y: (x[0]+y[0], x[1]+y[1])) \ # calculate sum & count 
    .mapValues(lambda x: x[0]/x[1]) \ # calculate average 
    .sortBy(lambda x: x[1], ascending = False) \ # sort 
    .take(100) 
+0

И без искры sql? – mel

+0

Вы имеете в виду использование 'rdd' api, почему, если у вас есть' DataFrame'? – mtoto

+0

Собственно, это были только те инструкции, которые у меня были. Мой код довольно грязный. Я определил функции и все, я думаю, что есть более простой способ, поэтому я спросил здесь. – mel

Смежные вопросы