Я пытаюсь извлечь максимальное значение столбца «ID» в Spark DataFrame и увеличивать его всякий раз, когда выполняется вставка.
Я могу напечатать максимальное значение, но не могу сохранить его в переменной
max_id = df.agg({"ID":"max"}).collect()[0]
print max_id["max(ID)"]
id2 = max_id["max{"ID"}]
выдает ошибку
SyntaxError: invalid syntax
Как извлечь то же самое в переменную и увеличить ее?
Рассмотрим следующий фрейм данных:
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
Проблема с вашим кодом выше заключается в том, что вы использовали фигурные скобки.
Пожалуйста, покажи мне свой отпечаток. Вероятно, вы пытаетесь сделать что-то вроде print('bla' + max_id)
. Это не сработает, поскольку python редко выполняет неявные преобразования. Вы должны преобразовать его в строку, когда хотите, чтобы он был напечатан с другой строкой: print('bla' + str(max_id))
.
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
Это не работает. является результатом max_id=DimDF.agg({"ID":"max"}).collect()[0]['max(ID)'] в int ? я не могу увидеть тип (max_id). тип в питоне. каков его эквивалент в pyspark?
Я понял, как извлечь максимальное значение столбца как 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
Привет, Cronoik, спасибо за ваш ответ, теперь я могу хранить максимальное значение в переменной max_id, когда я печатаю приращение, я получаю ошибку TypeError: принуждение к Unicode: нужна строка или буфер, найдено целое