Pyspark: показать гистограмму столбца фрейма данных

В кадре данных pandas я использую следующий код для построения гистограммы столбца:

my_df.hist(column = 'field_1')

Есть ли что-то, что может достичь той же цели в кадре данных pyspark? (Я в Jupyter Notebook) Спасибо!

Ответ 1

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

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

import pandas as pd
import pyspark.sql as sparksql

# Let use UCLA college admission dataset
file_name = "https://stats.idre.ucla.edu/stat/data/binary.csv"

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

sql_context = sparksql.SQLcontext(sc)

# Creating a Spark DataFrame from a pandas dataframe
df_spark = sql_context.createDataFrame(df_pd)

df_spark.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_pandas.hist('gre');

Гистограмма при построении графика с использованием df_pandas.hist()

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

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

# Loading the Computed Histogram into a Pandas Dataframe for plotting
pd.DataFrame(
    list(zip(*gre_histogram)), 
    columns=['bin', 'frequency']
).set_index(
    'bin'
).plot(kind='bar');

Гистограмма, вычисленная с использованием RDD.histogram()

Ответ 2

Теперь вы можете использовать пакет pyspark_dist_explore для использования функции matplotlib hist для Spark DataFrames:

from pyspark_dist_explore import hist
import matplotlib.pyplot as plt

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

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

Ответ 3

Метод histogram для 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()

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

Ответ 4

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

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

Затем все, что вам нужно, чтобы использовать агрегацию count, разбитую на окно:

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

Агрегирующие операторы происходят на каждом разделе кластера и не требуют дополнительного обратного прохода к хосту.