如何使用哈希码作为其值来设置索引列?

时间:2017-07-31 14:11:54

标签: java apache-spark apache-spark-sql apache-spark-ml

我尝试使用具有分类值(字符串值)的数据集来训练机器学习模型。但是,Spark模型不能使用String值进行训练,因此我必须将它们转换或将它们索引为数值。但是,我发现Spark唯一的String变换器是StringIndexer,但我发现它非常不可靠,因为它根据字符串的频率对字符串进行索引,并且我无法保证测试文件字符串值的频率将保持不变。所以我想到使用String变量的哈希码作为索引它们的方法。我可以轻松地遍历行并获取String of String值的哈希码并将它们存储在List中。但是,我不知道如何将此List添加到数据集中,以便能够使用它训练我的模型。列表将从顶行到底行排序,所以我试图找到一种将List转换为列的方法,但我不认为Spark有这个选项。如何知道如何从列表中创建新列并将其附加到我的训练数据集中?

1 个答案:

答案 0 :(得分:1)

所以我发现Spark有一个名为hash的函数,它创建一个包含另一列哈希值的int列。

我的问题的解决方案如下:

import org.apache.spark.sql.functions;

Column stringCol = new Column("stringValues");
trainingDF = trainingDF.withColumn("hashString", functions.hash(stringCol));