我尝试使用具有分类值(字符串值)的数据集来训练机器学习模型。但是,Spark模型不能使用String值进行训练,因此我必须将它们转换或将它们索引为数值。但是,我发现Spark唯一的String变换器是StringIndexer
,但我发现它非常不可靠,因为它根据字符串的频率对字符串进行索引,并且我无法保证测试文件字符串值的频率将保持不变。所以我想到使用String变量的哈希码作为索引它们的方法。我可以轻松地遍历行并获取String of String值的哈希码并将它们存储在List中。但是,我不知道如何将此List添加到数据集中,以便能够使用它训练我的模型。列表将从顶行到底行排序,所以我试图找到一种将List转换为列的方法,但我不认为Spark有这个选项。如何知道如何从列表中创建新列并将其附加到我的训练数据集中?
答案 0 :(得分:1)
所以我发现Spark有一个名为hash
的函数,它创建一个包含另一列哈希值的int列。
我的问题的解决方案如下:
import org.apache.spark.sql.functions;
Column stringCol = new Column("stringValues");
trainingDF = trainingDF.withColumn("hashString", functions.hash(stringCol));