PySpark AnalysisException: не удается разрешить имя столбца - PullRequest
0 голосов
/ 28 марта 2020

Я пытаюсь устранить следующую ошибку, я уже видел пару сообщений по этому вопросу, но не могу ее устранить. org. apache .spark. sql .AnalysisException: Невозможно разрешить имя "свойства" столбца среди * всех столбцов

Что я пробовал:

tempList = [] 
for col in Df.columns:
    new_name = col.strip()
    new_name = "".join(new_name.split())
    new_name = new_name.replace('.','')
    tempList.append(new_name) 
Df = Df.toDF(*tempList) 

У меня только 6 столбцов в моем кадре данных Spark, и у всех них ТОЛЬКО есть символы и подчеркивание. Схема для кадра данных:

StructType(List(StructField(A,ShortType,true),StructField(B,ShortType,true),StructField(C,IntegerType,true),StructField(D,IntegerType,true),StructField(E,StringType,true),StructField(F,DoubleType,true),StructField(G,IntegerType,true)))

Я пытаюсь реализовать PCA отсюда, https://www.nodalpoint.com/pca-in-spark-1-5/

Код для справки:

df = sc.parallelize([[1,2,3], [2,3,4]]).toDF(("a_1", "b", "c"))

def estimateCovariance(df):
    m = df.select(df['features']).map(lambda x: x[0]).mean()
    dfZeroMean = df.select(df['features']).map(lambda x: x[0]).map(lambda x: x-m)  # subtract the mean

    return dfZeroMean.map(lambda x: np.outer(x,x)).sum()/df.count()

def pca(df, k=2):
  cov = estimateCovariance(df)
  col = cov.shape[1]
  eigVals, eigVecs = eigh(cov)
  inds = np.argsort(eigVals)
  eigVecs = eigVecs.T[inds[-1:-(col+1):-1]]  
  components = eigVecs[0:k]
  eigVals = eigVals[inds[-1:-(col+1):-1]]  # sort eigenvalues
  score = df.select(df['features']).map(lambda x: x[0]).map(lambda x: np.dot(x, components.T) )
  scoreDF = sqlContext.createDataFrame(score.map(lambda x: (DenseVector(x),)), ['pca_features'])
  # Return the `k` principal components, `k` scores, and all eigenvalues

  return components.T, scoreDF, eigVals

comp, score, eigVals = pca(df)
score.collect()

Есть идеи, что может пойти не так?

Ответы [ 2 ]

0 голосов
/ 28 марта 2020

Из статьи, с которой вы связались:

Входные данные для нашей процедуры pca состоят из фрейма данных Spark, который включает в себя столбец с именем features, содержащий функции в виде DenseVectors.

Чуть дальше, вам дан пример того, как построить примерный набор данных:

>>> data = [(Vectors.dense([0.0, 1.0, 0.0, 7.0, 0.0]),),
...     (Vectors.dense([2.0, 0.0, 3.0, 4.0, 5.0]),),
...     (Vectors.dense([4.0, 0.0, 0.0, 6.0, 7.0]),)]
>>> df = sqlContext.createDataFrame(data,["features"])

Ваш набор данных содержит данные в нескольких различных столбцах. Вам нужно объединить это в один столбец векторов. У Spark ML есть инструмент для этого, а именно pyspark.ml.feature.VectorAssembler.

В вашем случае вам нужно что-то вроде:

from pyspark.ml.feature import VectorAssembler

vectorAssembler = VectorAssembler(inputCols=["a_1", "b", "c"], outputCol="features")
comp, score, eigVals = pca(vectorAssembler.transform(df))
0 голосов
/ 28 марта 2020

Не похоже, что у вас есть столбец features - если я правильно понимаю проблему, в этом примере все столбцы являются функциями, поэтому вам нужно выбрать все столбцы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...