2016-08-25 3 views

ответ

9

К сожалению, я не думаю, что в API-интерфейсе PySpark Dataframes есть чистая функция plot() или hist(), но я надеюсь, что в конечном итоге все будет в этом направлении.

В настоящее время вы можете вычислить гистограмму в Spark и построить вычисленную гистограмму в виде гистограммы. Пример:

import pandas as pd 
import pyspark.sql as sparksql 

# Let's use UCLA's college admission dataset 
file_name = "http://www.ats.ucla.edu/stat/data/binary.csv" 

# Creating a pandas dataframe from Sample Data 
pandas_df = pd.read_csv(file_name) 

sql_context = sparksql.SQLcontext(sc) 

# Creating a Spark DataFrame from a pandas dataframe 
spark_df = sql_context.createDataFrame(df) 

spark_df.show(5) 

Это то, что выглядит данные, как:

Out[]: +-----+---+----+----+ 
      |admit|gre| gpa|rank| 
      +-----+---+----+----+ 
      | 0|380|3.61| 3| 
      | 1|660|3.67| 3| 
      | 1|800| 4.0| 1| 
      | 1|640|3.19| 4| 
      | 0|520|2.93| 4| 
      +-----+---+----+----+ 
      only showing top 5 rows 


# This is what we want 
df.hist('gre'); 

Histogram when plotted in using df.hist()

# Doing the heavy lifting in Spark. We could leverage the `histogram` function from the RDD api 

gre_histogram = spark_df.select('gre').rdd.flatMap(lambda x: x).histogram(11) 

# Loading the Computed Histogram into a Pandas Dataframe for plotting 

    pd.DataFrame(zip(list(gre_histogram)[0], 
        list(gre_histogram)[1]),columns=['bin','frequency']).set_index('bin').plot(kind='bar'); 

Histogram computed by using RDD.histogram()

+0

Я получаю сообщение об ошибке при создании фрейма данных из итератора 'zip'. Учитывая гистограмму pyspark, создание фрейма pandas немного чище и работает для меня с помощью 'pd.DataFrame (list (zip (* gre_histogram)), columns = ['bin', 'frequency'])' –

+1

gre_histogram = spark_df. select ('gre'). rdd.flatMap (lambda x: x) .histogram (11) - выигрышная линия, комбо этот парень с ответом matplotlib ниже –

3

Вы можете теперь использовать pyspark_dist_explore пакет использовать функцию Matplotlib Hist для Spark DataFrames:

from pyspark_dist_explore import hist 

fig, ax = plt.subplots() 
hist(ax, data_frame, bins = 20, color=['red']) 

Эта библиотека использует функцию гистограммы rdd для расчета значений бинов.

+0

plt не найден ... –

1

Метод для RDD возвращает диапазоны ящиков и подсчеты bin. Вот функция, которая берет данные гистограммы и отображает ее как гистограмму.

import numpy as np 
import matplotlib.pyplot as mplt 
import matplotlib.ticker as mtick 

def plotHistogramData(data): 
    binSides, binCounts = data 

    N = len(binCounts) 
    ind = np.arange(N) 
    width = 1 

    fig, ax = mplt.subplots() 
    rects1 = ax.bar(ind+0.5, binCounts, width, color='b') 

    ax.set_ylabel('Frequencies') 
    ax.set_title('Histogram') 
    ax.set_xticks(np.arange(N+1)) 
    ax.set_xticklabels(binSides) 
    ax.xaxis.set_major_formatter(mtick.FormatStrFormatter('%.2e')) 
    ax.yaxis.set_major_formatter(mtick.FormatStrFormatter('%.2e')) 

    mplt.show() 

(Этот код предполагает, что контейнеры имеют одинаковую длину.)

0

Другое решение, без необходимости дополнительных импорта, , которые также должны быть эффективными; Во-первых, используйте окно раздела:

import pyspark.sql.functions as F 
import pyspark.sql as SQL 
win = SQL.Window.partitionBy('column_of_values') 

Тогда все, что вам нужно использовать граф агрегацию разделенную окна:

df.select(F.count('column_of_values').over(win).alias('histogram'))

агрегатного операторы происходит на каждом разделе кластера, и не требует дополнительного кругового путешествия к хосту.

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