Ошибка PySpark: исключение AnalysisException: ‘Не удается разрешить имя столбца

#apache-spark #exception #pyspark

#apache-искра #исключение #писпарк #apache-spark #pyspark

Вопрос:

Я пытаюсь преобразовать весь df в один векторный столбец, используя

df_vec = vectorAssembler.transform(df.drop('col200'))

Мне выдается эта ошибка:

File "/usr/hdp/current/spark2-client/python/pyspark/sql/utils.py", line 69, in deco
raise AnalysisException(s.split(': ', 1)[1], stackTrace)
pyspark.sql.utils.AnalysisException: 'Cannot resolve column name "col200" among (col1, col2..

Я поискал в Интернете и выяснил, что ошибка могла быть вызвана из-за некоторых пробелов в заголовках столбцов. Проблема в том, что существует около 1600 столбцов, и проверить каждый из них — непростая задача, особенно на наличие пробелов. Как мне подойти к этому? К вашему сведению, это df с примерно 800000 строками.

выполняя df.printSchema(), я не вижу никаких пробелов. По крайней мере, не ведущий. Я почти уверен, что ни в одном из имен столбцов также нет пробелов между ними.

На данный момент я полностью заблокирован! Любая помощь была бы очень признательна.

Ответ №1:

Это случалось со мной пару раз, попробуйте это:

 tempList = [] #Edit01
    for col in df.columns:
        new_name = col.strip()
        new_name = "".join(new_name.split())
        new_name = new_name.replace('.','') # EDIT
        tempList.append(new_name) #Edit02
print(tempList) #Just for the sake of it #Edit03

df = df.toDF(*tempList) #Edit04
  

Код обрезает и удаляет все пробелы из каждого отдельного столбца в вашем фрейме данных.

Комментарии:

1. Время ожидания истекло. Соединение с ядром прерывается. Он выполняется около 10 минут, и появляется сообщение «Нет подключения к ядру». К вашему сведению, существует около 1600 столбцов. Я делаю это в кластере HDInsight Spark. Я пробовал с 4 узлами и 6. То же самое на обоих. Объем набора данных составляет около 29 ГБ. Заранее спасибо.

2. I left выполняется независимо, и примерно через полчаса ожидания была выдана эта ошибка: An error was encountered: Invalid status code '400' from http://headnodehost:8998/sessions/0/statements/2 with error payload: "requirement failed: Session isn't active."

3. Возможно, вы сможете сделать это шаг за шагом, потому что ошибка выглядит как ошибка памяти. Вы можете разделить df.columns, например, на 16 списков по 100 столбцов и запускать его один раз за раз. ПД: Я не думаю, что с columnrenamed дорого обходится память.

4. Хорошо, я заставил это работать, не используя df = df.withColumnRenamed(col,new_name) , а что-то вроде строки df_new = df.withColumnRenamed(col,new_name) . Теперь, когда я все еще пытаюсь выполнить это, df_vec = vectorAssembler.transform(dropped_df) он выдает ту же ошибку AnalysisException: 'Cannot resolve column name . Сейчас я в растерянности.

5. Отлично!! Возможно, вам следует правильно отредактировать мой ответ, чтобы другие люди с такой же проблемой могли его решить 🙂

Ответ №2:

Должно работать следующее:

 import re
from pyspark.sql.functions import col

# remove spaces from column names
newcols = [col(column).alias(re.sub('s*', '', column) 
for column in df.columns]

# rename columns
df = df.select(newcols).show()
  

РЕДАКТИРОВАТЬ: в качестве первого шага, если вы просто хотите проверить, в каких столбцах есть пробелы, вы могли бы использовать что-то вроде следующего:

 space_cols = [column for column in df.columns if re.findall('s*', column) != []]
  

Кроме того, проверьте, есть ли какие-либо символы, которые не являются буквенно-цифровыми (или пробелом).:

 non_alnum = [column for column in df.columns if re.findall('[^a-zA-Z0-9s]', column) != []]
  

Комментарии:

1. Спасибо за это. К вашему сведению, согласно space_cols = [column for column in df.columns if re.findall('s*', column) != []] , в каждом столбце есть пробел — всего их 1640! Но затем, когда я пытаюсь newcols = [col(column).alias(re.sub('s*', '', column) for column in df.columns] , df = df.select(newcols).show() мне выдается та же ошибка. Теперь, из того, что я прочитал в Интернете (а также из-за переполнения стека) , ошибка, на которую я ссылаюсь, возникает из-за пробелов в именах столбцов. Возможно ли, что это происходит из-за чего-то совершенно другого?

2. каков результат « ‘col200’ в df.columns «?

3. Я запустил df = df.select('col1 AS col1 ').show() (ваш код добавляет ` как переименованный символ, но я не знаю, действительно ли это имеет значение), и ошибка была 'syntax error in attribute name: col1 AS col1 ;'

4. также можем ли мы также получить вывод df.printSchema() (несколько верхних строк или что-то еще) может помочь в отладке

5. ДА. Это работает. Я имею в виду, что значение col1 отображается правильно. Я также попробовал это с пробелом в начале и в конце и сразу же получил ту же ошибку. «не удается решить ‘ col1 ‘ данный входной столбец: [… Список из 1640 столбцов …]»

Ответ №3:

` или «» помогите определить весь столбец.

 df_vec = vectorAssembler.transform(df.drop('`col200`'))
  

или

 df_vec = vectorAssembler.transform(df.drop("col200"))