有人可以解释VectorAssembler
的行为吗?
from pyspark.ml.linalg import Vectors
from pyspark.ml.feature import VectorAssembler
assembler = VectorAssembler(
inputCols=['CategoryID', 'CountryID', 'CityID', 'tf'],
outputCol="features")
output = assembler.transform(tf)
output.select("features").show(truncate=False)
通过show方法的代码返回给我
(262147,[0,1,2,57344,61006,80641,126469,142099,190228,219556,221426,231784],[2.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0])
当我使用相同的变量“输出”时,我得到不同的回报
output.select('features').take(1)
[Row(features=SparseVector(262147, {0: 2.0, 1: 1.0, 2: 1.0, 57344: 1.0, 61006: 1.0, 80641: 1.0, 126469: 1.0, 142099: 1.0, 190228: 1.0, 219556: 1.0, 221426: 1.0, 231784: 1.0}))]
顺便说一下,考虑一下,“tfidf”有一个稀疏数组输出。我还有其他可用的数据(元数据)。我需要在Pyspark Dataframes中以某种方式聚合稀疏数组,并使用LSH算法的元数据。我已经尝试过VectorAssembler,但它也会返回密集的向量。也许有任何技巧来组合数据并仍然有稀疏数据作为输出。
只有两种回报的格式不同;在这两种情况下,你实际上得到了相同的稀疏向量。
len([0,1,2,57344,61006,80641,126469,142099,190228,219556,221426,231784])
# 12
len([2.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0])
# 12
{index: value}
形式的字典,该字典与前一个表示的列表具有相同的长度:
len({0: 2.0, 1: 1.0, 2: 1.0, 57344: 1.0, 61006: 1.0, 80641: 1.0, 126469: 1.0, 142099: 1.0, 190228: 1.0, 219556: 1.0, 221426: 1.0, 231784: 1.0} )
# 12
由于assembler.transform()
返回Spark数据帧,因此差异是由于Spark SQL函数show
和take
分别返回的格式不同。
顺便说一句,考虑案例[...]
目前还不清楚你究竟在这里问什么,无论如何我建议你用一个可重复的例子打开一个新问题,因为它听起来像是一个不同的主题......