Почему нахождение максимального числа в моем DataFrame дает 0? - PullRequest
0 голосов
/ 03 октября 2018

Моя нижеприведенная программа пытается распечатать цену самого дорогого дома, учитывая файл CSV, содержащий информацию о домах.Неожиданно я получаю 0 в качестве максимальной цены вместо ненулевого целого числа (которым я подтвердил существование, например, первой записи в файле CSV)?

Программа

public class SparkWordCounter {
    public static void main(String[] args) {
        SparkSession sparkSession = SparkSession.builder().appName("WordCounter").config("spark.master", "local").getOrCreate();

        String fileName = SparkWordCounter.class.getResource("/Sacramentorealestatetransactions.csv").toString();

        StructField[] structFields = {
            DataTypes.createStructField("street", DataTypes.StringType, false),
            DataTypes.createStructField("city", DataTypes.StringType, false),
            DataTypes.createStructField("zip", DataTypes.StringType, false),
            DataTypes.createStructField("state", DataTypes.StringType, false),
            DataTypes.createStructField("beds", DataTypes.ByteType, false),
            DataTypes.createStructField("baths", DataTypes.ByteType, false),
            DataTypes.createStructField("sqFt", DataTypes.ShortType, false),
            DataTypes.createStructField("type", DataTypes.StringType, false),
            DataTypes.createStructField("sale_data", DataTypes.StringType, false),
            DataTypes.createStructField("price", DataTypes.IntegerType, false),
            DataTypes.createStructField("latitude", DataTypes.StringType, false),
            DataTypes.createStructField("longitude", DataTypes.StringType, false)
        };

        StructType structType = DataTypes.createStructType(structFields);
        Dataset<Row> dataset = sparkSession.read().option("header", "true").schema(structType).csv(fileName);

        Dataset<Building> buildingDataset = dataset.as(Encoders.bean(Building.class));

        long price = buildingDataset
                .map(building -> building.price, Encoders.INT())
                .reduce(Integer::max);

        System.out.println("Price: " + price);
    }

    public static class Building implements Serializable {
        public String street;
        public String city;
        public String zip;
        public String state;
        public byte beds;
        public byte baths;
        public short sqFt;
        public String type;
        public String sale_date;
        public int price;
        public String latitude;
        public String longitude;
    }
}

Первая запись в формате CSV (всего 985)

street,city,zip,state,beds,baths,sqFt,type,sale_date,price,latitude,longitude
---,---,---,---,2,1,836,Residential,Wed May 21 00:00:00 EDT 2008,59222,38.---,---

--- представляет местоположение, раскрывающее информацию

цены гарантированно являются целыми числами, поэтому используется int (byte и short используются для значений с меньшими диапазонами).

Почему 0 рассчитывается как максимальная цена?

1 Ответ

0 голосов
/ 03 октября 2018

Проверьте, правильно ли загружен фрейм данных из CSV.Вы можете проверить данные в нем с помощью

buildingDataset.select("price").show(20)

Если данные для данных столбца цены выглядят нормально, используйте любой из способов для получения максимума.

SQL API

buildingDataset.createOrReplaceTempView("building");
sparkSession.sql("SELECT price FROM building ORDER BY price DESC LIMIT 1")
  .show();

Java

import static org.apache.spark.sql.functions.*;
buildingDataset.orderBy(col("price").desc())
    .limit(1)
    .show();
...