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")))) 

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

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

3 ответа

Решение

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

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

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

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

col

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

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

Есть еще одна возможная причина. В своих сценариях вы можете использовать col в качестве переменной. Это также может привести к появлению сообщения об ошибке.

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

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"))))

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

Другие вопросы по тегам