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