Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark PySpark PCA:如何将数据帧行从多列转换为单列DenseVector?_Apache Spark_Pyspark_Apache Spark Mllib_Pca_Apache Spark Ml - Fatal编程技术网

Apache spark PySpark PCA:如何将数据帧行从多列转换为单列DenseVector?

Apache spark PySpark PCA:如何将数据帧行从多列转换为单列DenseVector?,apache-spark,pyspark,apache-spark-mllib,pca,apache-spark-ml,Apache Spark,Pyspark,Apache Spark Mllib,Pca,Apache Spark Ml,我想使用PySpark(Spark 1.6.2)对蜂巢表中的数值数据执行主成分分析(PCA)。我可以将配置单元表导入Spark数据帧: >>从pyspark.sql导入HiveContext >>>hiveContext=hiveContext(sc) >>>dataframe=hiveContext.sql(“从我的表格中选择*) >>>类型(数据帧) >>>dataframe.columns ['par001'、'par002'、'par003'等…] >>>dataframe.collec

我想使用PySpark(Spark 1.6.2)对蜂巢表中的数值数据执行主成分分析(PCA)。我可以将配置单元表导入Spark数据帧:

>>从pyspark.sql导入HiveContext
>>>hiveContext=hiveContext(sc)
>>>dataframe=hiveContext.sql(“从我的表格中选择*)
>>>类型(数据帧)
>>>dataframe.columns
['par001'、'par002'、'par003'等…]
>>>dataframe.collect()
[世界其他地区(par001=1.1、par002=5.5、par003=8.2等)、世界其他地区(par001=0.0、par002=5.7、par003=4.2等)
有一篇优秀的StackOverflow文章展示了如何在PySpark中执行PCA:

在文章的“测试”部分,@desertnaut创建了一个只有一列的数据帧(称为“功能”):

>>来自pyspark.ml.feature导入*
>>>从pyspark.mllib.linalg导入向量
>>>数据=[(Vectors.densite([0.0,1.0,0.0,7.0,0.0]),
…(向量密集([2.0,0.0,3.0,4.0,5.0]),),
…(向量密集([4.0,0.0,0.0,6.0,7.0]),)
>>>df=sqlContext.createDataFrame(数据,[“功能”])
>>>类型(df)
>>>df.columns
[“功能”]
>>>df.collect()
[行(要素=DenseVector([0.0,1.0,0.0,7.0,0.0])),行(要素=DenseVector([2.0,0.0,3.0,4.0,5.0])),行(要素=DenseVector([4.0,0.0,0.0,6.0,7.0])]
@desertnaut示例数据框中的每一行都包含一个
DenseVector
对象,然后由
pca
函数使用


Q) 如何将配置单元中的数据框转换为单列数据框(“功能”),其中每行包含一个表示原始行中所有值的
DenseVector

您应该使用
矢量汇编程序。如果数据与此类似:

from pyspark.sql import Row

data = sc.parallelize([
    Row(par001=1.1, par002=5.5, par003=8.2),
    Row(par001=0.0, par002=5.7, par003=4.2)
]).toDF()
您应该导入所需的类:

from pyspark.ml.feature import VectorAssembler
创建一个实例:

assembler = VectorAssembler(inputCols=data.columns, outputCol="features")
变换并选择:

assembler.transform(data).select("features")
data.select(
  udf(Vectors.dense, VectorUDT())(*data.columns)
).toDF("features")
您还可以使用用户定义的函数。在Spark 1.6中,从
mllib
导入
向量
VectorUDT

from pyspark.mllib.linalg import Vectors, VectorUDT
sql.functions
中的
udf

from pyspark.sql.functions import udf, array
然后选择:

assembler.transform(data).select("features")
data.select(
  udf(Vectors.dense, VectorUDT())(*data.columns)
).toDF("features")
这不太冗长,但要慢得多