Python 如何转换类型<;类别';pyspark.sql.types.Row'&燃气轮机;成向量

Python 如何转换类型<;类别';pyspark.sql.types.Row'&燃气轮机;成向量,python,apache-spark,machine-learning,pyspark,k-means,Python,Apache Spark,Machine Learning,Pyspark,K Means,我是Spark的新手,目前我正在尝试使用Python编写一个简单的代码,对一组数据执行KMeans from pyspark import SparkContext, SparkConf from pyspark.sql import SQLContext import re from pyspark.mllib.clustering import KMeans, KMeansModel from pyspark.mllib.linalg import DenseVector from pysp

我是Spark的新手,目前我正在尝试使用Python编写一个简单的代码,对一组数据执行KMeans

from pyspark import SparkContext, SparkConf
from pyspark.sql import SQLContext
import re
from pyspark.mllib.clustering import KMeans, KMeansModel
from pyspark.mllib.linalg import DenseVector
from pyspark.mllib.linalg import SparseVector
from numpy import array
from pyspark.ml.feature import VectorAssembler
from pyspark.ml.feature import MinMaxScaler

import pandas as pd
import numpy
df = pd.read_csv("/<path>/Wholesale_customers_data.csv")
sql_sc = SQLContext(sc)
cols = ["Channel", "Region", "Fresh", "Milk", "Grocery", "Frozen", "Detergents_Paper", "Delicassen"]
s_df = sql_sc.createDataFrame(df)
vectorAss = VectorAssembler(inputCols=cols, outputCol="feature")
vdf = vectorAss.transform(s_df)
km = KMeans.train(vdf, k=2, maxIterations=10, runs=10, initializationMode="k-means||")
model = kmeans.fit(vdf)
cluster = model.clusterCenters()
print(cluster)
从pyspark导入SparkContext,SparkConf
从pyspark.sql导入SQLContext
进口稀土
从pyspark.mllib.clustering导入KMeans、KMeansModel
从pyspark.mllib.linalg导入DenseVector
从pyspark.mllib.linalg导入SparseVector
从numpy导入数组
从pyspark.ml.feature导入向量汇编程序
从pyspark.ml.feature导入MinMaxScaler
作为pd进口熊猫
进口numpy
df=pd.read\u csv(//Wholesale\u customers\u data.csv)
sql\u sc=SQLContext(sc)
cols=[“渠道”、“区域”、“新鲜”、“牛奶”、“食品”、“冷冻”、“清洁剂纸”、“熟食”]
s_df=sql_sc.createDataFrame(df)
vectorAss=VectorAssembler(inputCols=cols,outputCol=“feature”)
vdf=矢量类变换(s_-df)
km=KMeans.train(vdf,k=2,最大迭代次数=10,运行次数=10,初始化模式=“k-means | |”)
模型=kmeans.fit(vdf)
cluster=model.clusterCenters()
打印(群集)
我在pyspark shell中输入了这些,当它运行model=kmeans.fit(vdf)时,我得到了以下错误:

TypeError:无法将类型转换为向量

在 org.apache.spark.api.python.PythonRunner$$anon$1.read(PythonRDD.scala:166) 在 PythonRunner$$anon$1.(PythonRDD.scala:207) 在 org.apache.spark.api.python.PythonRunner.compute(PythonRDD.scala:125) 位于org.apache.spark.api.python.PythonRDD.compute(PythonRDD.scala:70) 位于org.apache.spark.rdd.rdd.computeOrReadCheckpoint(rdd.scala:313) org.apache.spark.rdd.rdd.iterator(rdd.scala:277)位于 org.apache.spark.rdd.MapPartitionsRDD.compute(MapPartitionsRDD.scala:38) 位于org.apache.spark.rdd.rdd.computeOrReadCheckpoint(rdd.scala:313) org.apache.spark.CacheManager.getOrCompute(CacheManager.scala:69)位于 org.apache.spark.rdd.rdd.iterator(rdd.scala:275)位于 org.apache.spark.rdd.ZippedPartitionsRDD2.compute(ZippedPartitionsRDD.scala:88) 位于org.apache.spark.rdd.rdd.computeOrReadCheckpoint(rdd.scala:313) org.apache.spark.rdd.rdd.iterator(rdd.scala:277)位于 org.apache.spark.rdd.MapPartitionsRDD.compute(MapPartitionsRDD.scala:38) 位于org.apache.spark.rdd.rdd.computeOrReadCheckpoint(rdd.scala:313) org.apache.spark.rdd.rdd.iterator(rdd.scala:277)位于 org.apache.spark.scheduler.ResultTask.runTask(ResultTask.scala:66)位于 org.apache.spark.scheduler.Task.run(Task.scala:89)位于 org.apache.spark.executor.executor$TaskRunner.run(executor.scala:227) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 在java.lang.Thread.run(Thread.java:745)17/02/26 23:31:58错误 执行者:第23.0阶段任务6.0中的异常(TID 113) org.apache.spark.api.python.PythonException:回溯(最新版本) 调用最后一个文件 “/usr/hdp/2.5.0.0-1245/spark/python/lib/pyspark.zip/pyspark/worker.py”, 第111行,在main process()文件中 “/usr/hdp/2.5.0.0-1245/spark/python/lib/pyspark.zip/pyspark/worker.py”, 第106行,进程内序列化程序.dump\u流(func(split\u索引, 迭代器(输出文件)文件 “/usr/hdp/2.5.0.0-1245/spark/python/lib/pyspark.zip/pyspark/serializers.py”, 第263行,在dump_stream vs=list(itertools.islice(迭代器,批处理))中 文件 “/usr/hdp/2.5.0.0-1245/spark/python/lib/pyspark.zip/pyspark/mllib/linalg/init.py”,第77行,在“转换为向量提升类型错误”(“无法转换类型%s 转换为向量“%type(l))类型错误:无法将类型转换为向量

我得到的数据来自:

谁能告诉我这里出了什么问题,我错过了什么?谢谢你的帮助

谢谢大家!

更新: @盖伦 我得到的错误是:

我得到的错误是:>>>>kmm=kmeans.fit(s_df)17/03/02 21:58:01信息 BlockManagerInfo:已删除本地主机上的广播\u 1\u片段0:56193 in 内存(大小:5.8KB,可用空间:511.1MB)17/03/02 21:58:01信息 上下文清洁剂:清洁的蓄能器5 17/03/02 21:58:01信息 BlockManagerInfo:已删除本地主机上的广播\u 0\u片段0:56193 in 内存(大小:5.8KB,可用空间:511.1MB)17/03/02 21:58:01信息 上下文清洁剂:清洁的蓄能器4

回溯(最近一次调用):文件“”,第1行,在 文件 “/usr/hdp/2.5.0.0-1245/spark/python/pyspark/ml/pipeline.py”,第69行, 合拍 返回self._fit(数据集)文件“/usr/hdp/2.5.0.0-1245/spark/python/pyspark/ml/wrapper.py”,第133行, 合身 java_model=self._fit_java(数据集)文件“/usr/hdp/2.5.0.0-1245/spark/python/pyspark/ml/wrapper.py”,第130行, 在java中 返回self._java_obj.fit(dataset._jdf)文件“/usr/hdp/2.5.0.0-1245/spark/python/lib/py4j-0.9-src.zip/py4j/java_gateway.py”, 第813行,在调用文件中 “/usr/hdp/2.5.0.0-1245/spark/python/pyspark/sql/utils.py”,第51行,在 德科 raise AnalysisException(s.split(“:”,1)[1],stackTrace)pyspark.sql.utils.AnalysisException:u“无法解析给定的“功能” 输入列:[渠道、食品杂货、新鲜、冷冻、洗涤剂和纸张, 地区、熟食店、牛奶店]


仅在[即将弃用]Spark mllib包上使用Spark 2.x ML包:

from pyspark.ml.clustering import KMeans
from pyspark.ml.feature import VectorAssembler
df = spark.read.option("inferSchema", "true").option("header", "true").csv("whole_customers_data.csv")
cols = df.columns
vectorAss = VectorAssembler(inputCols=cols, outputCol="features")
vdf = vectorAss.transform(df)
kmeans = KMeans(k=2, maxIter=10, seed=1)
kmm = kmeans.fit(vdf)
kmm.clusterCenters()

您在哪一行收到错误?您好Vivek,这一行是:model=kmeans.fit(vdf)您好Garren,您能分享您的代码吗?我运行了代码,但出现了错误。。谢谢你的帮助@hpnhxxwn我将在更新的答案中共享代码。还请发布您的错误,以便其他人也可以从中学习。@hpnhxxwn很高兴它对您起到了作用!请将答案标记为已接受。我怀疑一些问题可能来自于尝试将Spark 2.x ML与旧的Spark mllib混合使用。我看到您的更新显示“功能”缺失,这似乎至少部分是因为您使用的
outputCol=“feature”
没有“s”