2017-06-16 43 views
0

所以,我是新来的Apache Spark和我有一个看起来像这样的文件:当DataFrame有列时如何使用Java Apache Spark MLlib?

Name  Size Records 
File1 1,000 104,370 
File2 950  91,780 
File3 1,500 109,123 
File4 2,170 113,888 
File5 2,000 111,974 
File6 1,820 110,666 
File7 1,200 106,771 
File8 1,500 108,991 
File9 1,000 104,007 
File10 1,300 107,037 
File11 1,900 111,109 
File12 1,430 108,051 
File13 1,780 110,006 
File14 2,010 114,449 
File15 2,017 114,889 

这是我的样品/测试数据。我正在开发一个异常检测程序,我必须测试其他格式相同但不同值的文件,并检测哪一个文件在大小和记录值上存在异常(如果另一个文件上的大小/记录与标准大小不同,或者如果大小和记录彼此不成比例)。我决定开始尝试不同的ML算法,我想从k-Means方法开始。我试着把这个文件放在下面一行:

KMeansModel model = kmeans.fit(file) 

文件已经被解析为一个Dataset变量。然而,我得到一个错误,我很确定它与文件的结构/模式有关。在试图适应模型时,是否有办法处理结构化/标记/组织数据?

我收到以下错误:线程“主”java.lang.IllegalArgumentException异常:字段“功能”不存在。

这是代码:

public class practice { 

public static void main(String[] args) { 
    SparkConf conf = new SparkConf().setAppName("Anomaly Detection").setMaster("local"); 
    JavaSparkContext sc = new JavaSparkContext(conf); 

    SparkSession spark = SparkSession 
       .builder() 
       .appName("Anomaly Detection") 
       .getOrCreate(); 

String day1 = "C:\\Users\\ZK0GJXO\\Documents\\day1.txt"; 

    Dataset<Row> df = spark.read(). 
      option("header", "true"). 
      option("delimiter", "\t"). 
      csv(day1); 
    df.show(); 
    KMeans kmeans = new KMeans().setK(2).setSeed(1L); 
    KMeansModel model = kmeans.fit(df); 
} 

}

感谢

回答

2

默认情况下,所有的Spark车型ML上所谓的 “功能” 一栏训练。一个可以通过setFeaturesCol方法指定一个不同的输入列名http://spark.apache.org/docs/latest/api/java/org/apache/spark/ml/clustering/KMeans.html#setFeaturesCol(java.lang.String)

更新:

人们可以使用多列组合成单个特征矢量VectorAssembler:

VectorAssembler assembler = new VectorAssembler() 
.setInputCols(new String[]{"size", "records"}) 
.setOutputCol("features"); 

Dataset<Row> vectorized_df = assembler.transform(df) 

KMeans kmeans = new KMeans().setK(2).setSeed(1L); 
KMeansModel model = kmeans.fit(vectorized_df); 

可以进一步简化和链这些使用管线进行特征转换API https://spark.apache.org/docs/latest/ml-pipeline.html#example-pipeline

+0

等等,这意味着他们只会训练一列而忽略其余部分? –

+0

要在多列上训练,可以使用VectorAssembler创建一个特征矢量,如https://spark.apache.org/docs/latest/ml-features.html#vectorassembler –

相关问题