Итерировать по столбцам в искровом фрейме данных и вычислить минимальное максимальное значение

Я хочу перебирать столбцы фрейма данных в моей программе Spark и вычислять минимальное и максимальное значение. Я новичок в Spark и scala и не могу перебирать столбцы после того, как получаю их в фреймворке данных.

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

val parquetRDD = spark.read.parquet("filename.parquet")

parquetRDD.collect.foreach ({ i => parquetRDD_subset.agg(max(parquetRDD(parquetRDD.columns(2))), min(parquetRDD(parquetRDD.columns(2)))).show()})

Благодарим за любую помощь в этом вопросе.


person sabby    schedule 18.07.2017    source источник


Ответы (1)


Вы не должны повторять строки или записи. Вы должны использовать функцию агрегирования

import org.apache.spark.sql.functions._
val df = spark.read.parquet("filename.parquet")
val aggCol = col(df.columns(2))
df.agg(min(aggCol), max(aggCol)).show()

Сначала, когда вы выполняете spark.read.parquet, вы читаете фрейм данных. Затем мы определяем столбец, над которым хотим работать, используя функцию col. Функция col переводит имя столбца в столбец. Вместо этого вы можете использовать df ("имя"), где имя - это имя столбца.

Функция agg принимает столбцы агрегации, поэтому min и max являются функциями агрегации, которые принимают столбец и возвращают столбец с агрегированным значением.

Обновить

Согласно комментариям, цель состоит в том, чтобы иметь минимальное и максимальное значение для всех столбцов. Поэтому вы можете сделать это:

val minColumns = df.columns.map(name => min(col(name)))
val maxColumns = df.columns.map(name => max(col(name)))
val allMinMax = minColumns ++ maxColumns
df.agg(allMinMax.head, allMinMax.tail: _*).show()

Вы также можете просто сделать:

df.describe().show()

который дает вам статистику по всем столбцам, включая min, max, avg, count и stddev

person Assaf Mendelson    schedule 18.07.2017
comment
Спасибо Ассафу за ваш ответ. Но здесь, в val aggCol = col (df.columns (2)), мы не передаем номер столбца (в данном случае 2) вручную. Есть ли способ передать это динамически, чтобы я мог перебирать столбцы один за другим в цикле и генерировать min max. Спасибо вам. - person sabby; 18.07.2017
comment
Спасибо, Ассаф! это действительно помогает, но можно ли это записать в цикле, чтобы мне не нужно было передавать имя столбца вручную. Когда я говорю повторять в своем вопросе, я имел в виду цикл по столбцам один за другим. В приведенном ниже примере у нас есть три столбца, и я хотел бы динамически выбирать каждый столбец, вычислять его минимальный максимум, без необходимости передавать имя столбца вручную. Предположим, что любой случайный набор значений для col1, col2, col3 col1 col2 col3 - person sabby; 18.07.2017