有人可以解释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”时,我得到不同的回报
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,但它也会返回密集的向量。也许有任何技巧来组合数据并仍然有稀疏数据作为输出。
答案 0 :(得分:1)
只有两种回报的格式不同;在这两种情况下,实际上都得到了相同的稀疏向量。
在第一种情况下,您将得到一个包含3个元素的稀疏向量:维度(262147)和两个包含索引&的列表。分别为非零元素的值。您可以轻松验证这些列表的长度是否相同,应该是:
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
分别返回的格式不同。
顺便说一下,考虑案例[...]
目前还不清楚你究竟在这里问什么,无论如何我建议你用一个可重复的例子打开一个新的问题,因为它听起来像是一个不同的主题......