Как сохранить максимальное значение столбца Spark DataFrame в переменной и увеличить его?

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

Я могу напечатать максимальное значение, но не могу сохранить его в переменной

max_id = df.agg({"ID":"max"}).collect()[0]
print max_id["max(ID)"]

id2 = max_id["max{"ID"}] выдает ошибку

SyntaxError: invalid syntax

Как извлечь то же самое в переменную и увеличить ее?

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
0
2 339
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Рассмотрим следующий фрейм данных:

l1 = [(1,2),(3,4),(5,6), (12,537)]

df1 = spark.createDataFrame(l1,['ID','col2'])

max_id=df1.agg({"ID":"max"}).collect()[0]

Переменная max_id — это pyspark.sql.types.Row. Вы можете проверить это с помощью type():

type(max_id)

Выход:

<class 'pyspark.sql.types.Row'>

К элементам pyspark.sql.types.Row можно получить доступ как к словарям с квадратными скобками:

max_id['max(ID)']

Итак, все, что вы хотите изменить, это ваше назначение max_id:

max_id=df1.agg({"ID":"max"}).collect()[0]['max(ID)']
type(max_id)

Выход:

<class 'int'>

max_id теперь является целым числом, которое можно увеличивать:

max_id = max_id+1

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

Привет, Cronoik, спасибо за ваш ответ, теперь я могу хранить максимальное значение в переменной max_id, когда я печатаю приращение, я получаю ошибку TypeError: принуждение к Unicode: нужна строка или буфер, найдено целое

Tejas 10.04.2019 09:30

Пожалуйста, покажи мне свой отпечаток. Вероятно, вы пытаетесь сделать что-то вроде print('bla' + max_id). Это не сработает, поскольку python редко выполняет неявные преобразования. Вы должны преобразовать его в строку, когда хотите, чтобы он был напечатан с другой строкой: print('bla' + str(max_id)).

cronoik 10.04.2019 09:36

max_id=DimDF.agg({"ID":"max"}).collect()[0]['max(ID)'] print max_id //результат: 3 (максимальное значение в столбце) max_id = max_id+1 print max_id TypeError: принуждение к Unicode: нужна строка или буфер, найден int, я просто пытаюсь напечатать значение int

Tejas 10.04.2019 09:39

Это не работает. является результатом max_id=DimDF.agg({"ID":"max"}).collect()[0]['max(ID)'] в int ? я не могу увидеть тип (max_id). тип в питоне. каков его эквивалент в pyspark?

Tejas 10.04.2019 10:42
Ответ принят как подходящий

Я понял, как извлечь максимальное значение столбца как int.

maxid=int(df.describe("ID").filter("summary = 'max'").select("ID").collect()[0].asDict()['ID']

распечатать максид --- результат :3

идентификатор2=максимум+1 напечатать идентификатор2 --- результат 4

df = spark.range(5)

Если вам нужен только одна агрегация на столбец, .agg({'id':'max'}) подойдет:

max_id = df.agg({'id':'max'}).collect()[0][0]

print(max_id)
# 4

Если вам нужен больше агрегаций на столбец, .agg({'id':'max', 'id':'min'} не сработает (будет возвращен только последний).

Вам понадобится .select:

from pyspark.sql import functions as F

max_min = df.select(F.max('id'), F.min('id')).collect()[0]
max_id, min_id = max_min[0], max_min[1]

print(max_id, min_id)
# 4 0

Другие вопросы по теме