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

#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