Ошибка PySpark: AnalysisException: «Не удается разрешить имя столбца - PullRequest
1 голос
/ 01 апреля 2019

Я пытаюсь преобразовать весь 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 (), я не вижу пробелов. По крайней мере, не ведущий. Я уверен, что ни одно из имен столбцов не должно содержать пробелов между ними.

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

Ответы [ 2 ]

0 голосов
/ 01 апреля 2019

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

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

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

0 голосов
/ 01 апреля 2019

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

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-9\s]', column) != []]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...