#python #apache-spark #apache-spark-sql
#python #apache-spark #apache-spark-sql
Вопрос:
Я пытаюсь создать sql-запрос последовательного when
.
def build_modify_function(df, ids_colname, modified_colname, modification_list):
if len(modification_list) == 0:
pass
# Small optimization
id_col = df[ids_colname]
modif_col = df[modified_colname]
# There is no "identity element" so :
ret = None
for (row_ids, new_value) in modification_list:
if type(row_ids) != type(list()):
row_ids = list(row_ids)
if ret == None:
ret = when(id_col.isin(row_ids), new_value) # .isin(row_ids)
else:
ret = ret.when(id_col.isin(row_ids), new_value)
return modif_col if ret == None else ret.otherwise(modif_col)
df
является фреймом данных,
ids_colname
это имя столбца моих идентификаторов,
modified_colname
это имя столбца, которое я хочу изменить,
modification_list
это список кортежей [(list_of_ids, new_value)]
У меня возникла эта ошибка:
ValueError: Cannot convert column into bool:
please use 'amp;' for 'and', '|' for 'or', '~' for 'not' when building DataFrame boolean expressions.
Я не понимаю, почему. Когда я создаю очень простую функцию, возвращающую :
tmp = when(id_col.isin(row_ids), new_value)
return tmp
.when(id_col.isin(row_ids), new_value)
.otherwise(modif_col)
Это отлично работает. Есть предложения?
Ответ №1:
Я считаю, что проблема здесь:
if ret == None:
...
В общем, вы никогда не должны использовать операторы равенства для сравнения с одноэлементными объектами в Python и всегда использовать is
или is not
:
if ret is None:
...
В этом конкретном случае оператор равенства для столбца возвращает a Column
, а Column
объект явно запрещает преобразование в bool.