#python #apache-spark #pyspark #apache-spark-sql #max
#python #apache-spark #pyspark #apache-spark-sql #макс
Вопрос:
Я пытаюсь извлечь максимальное значение столбца «ID» в Spark DataFrame и увеличивать его всякий раз, когда выполняется вставка.
Я могу напечатать максимальное значение, но не могу сохранить его в переменной
max_id = df.agg({"ID":"max"}).collect()[0]
print max_id["max(ID)"]
id2 = max_id["max{"ID"}]
выдает ошибку
Ошибка синтаксиса: недопустимый синтаксис
Как извлечь то же самое в переменную и увеличить ее?
Ответ №1:
Рассмотрим следующий фрейм данных:
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.Доступ к строке можно получить как к словарям с квадратными скобками:
max_id['max(ID)']
Итак, все, что вы хотите изменить, это ваше назначение max_id:
max_id=df1.agg({"ID":"max"}).collect()[0]['max(ID)']
type(max_id)
Вывод:
<class 'int'>
max_id теперь является значением int, которое можно увеличивать:
max_id = max_id 1
Проблема с вашим кодом выше заключается в том, что вы использовали фигурные скобки.
Комментарии:
1. Привет, Cronoik, спасибо за ваш ответ, теперь я могу сохранить максимальное значение в переменной max_id, когда я печатаю увеличенное значение, я получаю ошибку TypeError: приведение к Юникоду: нужна строка или буфер, найден int
2. Пожалуйста, покажите мне свою печать. Вы, вероятно, пытаетесь сделать что-то вроде
print('bla' max_id)
. Это не сработает, поскольку python редко выполняет неявные преобразования. Вы должны преобразовать его в строку, если хотите, чтобы оно было напечатано с другой строкой :print('bla' str(max_id))
.3. max_id=DimDF.agg({«ID»:»max»}).collect()[0][‘max(ID)’] print max_id // результат: 3 (максимальное значение в столбце) max_id = max_id 1 print max_id Ошибка типа: приведение к Юникоду: нужна строка илиbuffer, int найдено, я просто пытаюсь напечатать значение int
4. Это не сработает. является ли результат max_id=DimDF.agg({«ID»:»max»}).collect()[0][‘max(ID)’] результатом int ? я не могу видеть тип (max_id). тип в python. каков его эквивалент в pyspark?
Ответ №2:
Я выяснил, как извлечь максимальное значение столбца как int.
maxid=int(df.describe(«ID»).filter(«summary = ‘max'»).select(«ID»).collect()[0].asDict()[‘ID’]
вывести maxid — результат: 3
id2=maxid 1 печать id2 — результат 4
Ответ №3:
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