如何从spark ml的长表中聚合功能

atmip9wb  于 2021-06-28  发布在  Hive
关注(0)|答案(1)|浏览(323)

我想从存储在配置单元表中的数据构建一个pyspark-ml模型。数据如下所示:

ID | value
---+------
1  |  100
1  |  101
1  |  102
2  |  101
2  |  103

使用纯Hive,我可以选择使用 collect_set 要将值折叠到配置单元数组中,生成如下内容:

ID | value
---+-----------
1  | (100, 101, 102)
2  | (101, 103)

这些值是分类特征。对于这个特殊的用例,我可以把它们看作1的稀疏向量的索引,但是最好有一个针对一般分类的解决方案 StringIndexer() . 我想做的是把这些值收集到一个特征向量中,然后我可以把它输入到一个分类器中。
我尝试使用一个udf将数组转换成vectorudt,然后使用vectorindexer()进行特征化,但是当我尝试这样做时,它抱怨所有向量的长度都不相同。
收集这些的正确方法是什么?

bzzcjhmw

bzzcjhmw1#

没有什么能阻止你使用 collect_set 在sparksql中也是如此。只是很贵。如果你不介意你所需要的只是一堆进口商品:

from pyspark.sql.functions.import collect_set, udf, col
from pyspark.ml.linag import SparseVector

n = df.max("value").first[0] + 1

to_vector = udf(lambda xs: SparseVector(n, {x: 1.0 for x in xs})

(df
    .groupBy("id", collect_set(col("value")).alias("values"))
    .select("id", to_vector(col("values")).alias("features")))

相关问题