Проблема настройки ввода и вывода в Spark с помощью векторного ассемблера (Java) - PullRequest
0 голосов
/ 16 апреля 2019

У меня есть набор данных с 5408 столбцами, все они напечатаны так: _c0 | _c1 | _c2 | _c3 | _c4 | _c5 | _c6 | _c7 | _c8 | _c9 | | -0,169 | -0,025 | -0,010 | -0,041 | -0,045 | -0,069 | 0,038 | 0,014 | 0,008 | -0,014 |.

Я хочу собрать все столбцы вместе и разделить метку, но у меня есть эта ошибка, которая означает, что мои столбцы не поддерживаются: xception в потоке "main" java.lang.IllegalArgumentException: строка типа данных столбца _c0 не поддерживается. Строка типа данных столбца _c1 не поддерживается. Строка типа данных столбца _c2 не поддерживается. Строка типа данных столбца _c3 не поддерживается. Строка типа данных столбца _c4 не поддерживается.

Я хочу создать модель ML, поэтому толстый у меня есть:

Dataset<Row> csvData = spark.read()
                .option("header", false)
                .option("inferSchema", true)
                .csv("src/main/resou`enter code here`rces/K9.data");

        StringIndexer conditionIndexer = new StringIndexer ()
                .setInputCol("_c5408")
                .setOutputCol("_c5408Index");
        csvData = conditionIndexer.fit(csvData).transform(csvData);

//Cleaning data
List<org.apache.spark.sql.Column> list = new ArrayList<org.apache.spark.sql.Column>();
        for (String col : csvData.columns()) {
            list.add(when(csvData.col(col).equalTo("?"), 0).otherwise(csvData.col(col)).alias(col));
        }
        csvData = csvData.select(list.toArray(new org.apache.spark.sql.Column[0]));


    List<org.apache.spark.sql.Column> list_null = new ArrayList<org.apache.spark.sql.Column>();
    for (String col : csvData.columns()) {
        list_null.add(when(csvData.col(col).isNull(), 0).otherwise(csvData.col(col)).alias(col));
    }
    csvData = csvData.select(list_null.toArray(new org.apache.spark.sql.Column[0]));

    csvData = csvData.na().fill(0, csvData.columns());
        csvData.groupBy(col("_c5408"),col("_c5408Index")).count().show();

 ArrayList<String> inputColsList = new ArrayList<>(Arrays.asList(csvData.columns()));
        //Make single features column for feature vectors
        inputColsList.remove("_c5408Index");

        VectorAssembler vectorAssembler = new VectorAssembler()
                .setInputCols(inputColsList.parallelStream().toArray(String[]::new))
                .setOutputCol("features");

       `enter code here` Dataset<Row> modelInputData = vectorAssembler.transform(csvData)
                .select("_c5408Index", "features")
                .withColumnRenamed("_c5408Index", "label");

Ошибка в том случае, если записан набор данных modelInputData = vectorAssembler.transform (csvData).

Схема

|-- _c0: string (nullable = true)
 |-- _c1: string (nullable = true)
 |-- _c2: string (nullable = true)
 |-- _c3: string (nullable = true)
 |-- _c4: string (nullable = true)
 |-- _c5: string (nullable = true)
 |-- _c6: string (nullable = true)
 |-- _c7: string (nullable = true)
 |-- _c8: string (nullable = true)
 |-- _c9: string (nullable = true)
 |-- _c10: string (nullable = true)
 |-- _c11: string (nullable = true)
 |-- _c12: string (nullable = true)
 |-- _c13: string (nullable = true)
 |-- _c14: string (nullable = true)
 |-- _c15: string (nullable = true)
 |-- _c16: string (nullable = true)
 |-- _c17: string (nullable = true)
 |-- _c18: string (nullable = true)
 |-- _c19: string (nullable = true)
 |-- _c20: string (nullable = true)

c5408Index: double (nullable = false)

Наборы данных выглядят как

...