java - 为什么在我的 DataFrame 中找到最大数字会产生 0?
问题描述
我的下面的程序尝试打印最昂贵的房子的价格,给定一个包含有关房屋信息的 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.---,---
---
表示信息显示位置
价格保证为整数,因此使用 an int
(byte
并且short
用于具有较小范围的值)。
为什么 0 被计算为最高价格?
解决方案
检查从 CSV 加载的数据框是否正确。您可以通过以下方式检查其中的数据
buildingDataset.select("price").show(20)
如果价格列数据的数据看起来不错,则使用任何一种方式来获取最大值。
SQL API
buildingDataset.createOrReplaceTempView("building");
sparkSession.sql("SELECT price FROM building ORDER BY price DESC LIMIT 1")
.show();
爪哇
import static org.apache.spark.sql.functions.*;
buildingDataset.orderBy(col("price").desc())
.limit(1)
.show();
推荐阅读
- c# - 从用户控件代码调用页面函数
- python - Johansen 检验产生了不正确的特征向量
- reactjs - 如何将产品的订单详细信息发送到 mongodb?
- asp.net - 图片标题 - 资源应使用缓存清除,但 URL 与配置的模式不匹配
- azure - 备份 Windows 服务器 Azure VM 新 Azure 恢复服务 Vault 错误代码 BMSUserErrorContainerObjectNotFound
- python - 在 pyqt5 小部件中更新 matplotlib
- google-calendar-api - Google Calendar API - 修改以下所有实例(更新自我与会者响应状态)
- javascript - Javascript 拖放更改 div dragDrop
- ssh - 需要帮助查找用于沉浸式实验室 Going Places 的 SSH 令牌
- python - 通过 pandas 与 pyarrow 转换模式