PySpark: TypeError: объект 'str' не может быть вызван в операциях фрейма данных

Я читаю файлы из папки в цикле и создаю из них фреймы данных. Однако я получаю эту странную ошибку TypeError: 'str' object is not callable. Пожалуйста, найдите код здесь:

for yr in range (2014,2018):
  cat_bank_yr = sqlCtx.read.csv(cat_bank_path+str(yr)+'_'+h1+'bank.csv000',sep='|',schema=schema)
  cat_bank_yr=cat_bank_yr.withColumn("cat_ledger",trim(lower(col("cat_ledger"))))
  cat_bank_yr=cat_bank_yr.withColumn("category",trim(lower(col("category"))))

Код выполняется на одной итерации, а затем останавливается на строке

cat_bank_yr=cat_bank_yr.withColumn("cat_ledger",trim(lower(col("cat_ledger")))) 

с указанной выше ошибкой.

Кто-нибудь может помочь?


person pnv    schedule 29.08.2019    source источник
comment
Вы импортируете trim, col и lower из модуля PySpark.sql.functions? Можете ли вы также добавить свою строку импорта? Ваш код выглядит нормально, но ваши функции могут быть перезаписаны чем-то другим, например строка типа trim="my_new_string   -  person Thomas    schedule 29.08.2019
comment
не могли бы вы опубликовать полный код?   -  person Shreyash Sharma    schedule 29.08.2019


Ответы (2)


Ваш код выглядит нормально - если ошибка действительно происходит в строке, о которой вы говорите, вы, вероятно, случайно перезаписали одну из функций PySpark строкой.

Чтобы проверить это, поместите следующую строку прямо над циклом for и посмотрите, работает ли теперь код без ошибок:

from pyspark.sql.functions import col, trim, lower

В качестве альтернативы, дважды проверьте, действительно ли код останавливается в указанной вами строке, или проверьте, являются ли col, trim, lower тем, что вы ожидаете, вызвав их следующим образом:

col

должен вернуться

функция pyspark.sql.functions._create_function .._ (col)

person Thomas    schedule 29.08.2019
comment
Ты обалденный! У меня была такая строчка: pivot_cols=[col for col in cat_bank_yr.columns]. Никогда не ожидал, что это вызовет проблемы! Изменил имя переменной, теперь все хорошо. - person pnv; 29.08.2019

В разделе импорта используйте:

from pyspark.sql import functions as F

Затем в коде везде, где используется col, используйте F.col, чтобы ваш код был таким:

# on top/header part of code 
from pyspark.sql import functions as F
    
for yr in range (2014,2018):
    cat_bank_yr = sqlCtx.read.csv(cat_bank_path+str(yr)+'_'+h1+'bank.csv000',sep='|',schema=schema)
    cat_bank_yr=cat_bank_yr.withColumn("cat_ledger",trim(lower(F.col("cat_ledger"))))
    cat_bank_yr=cat_bank_yr.withColumn("category",trim(lower(F.col("category"))))

Надеюсь, это сработает. Удачи.

person imtheone    schedule 02.12.2020
comment
Я отредактировал ваш ответ, чтобы использовать блоки кода. Используйте кнопку [{}] при редактировании или перейдите по ссылке: meta.stackexchange.com/editing-help - person electromaggot; 03.12.2020