错误记录--hive临时表小于1的小数与零比较

在进行Hive查询时遇到一个奇怪的错误,当比较临时表中的index_value字段大于0时,预期4条数据大于零但实际只有2条。通过创建示例数据验证,发现可能涉及类型转换问题。修改代码后问题解决,但在实际表中未复现此问题,需要进一步研究其原因。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在用真实数据测试之前写过的一段代码逻辑时,发现了一个很神奇的错误,sql看着没错,但是判断index_value>0的时候明明有4条数据大于零,但是查询跑出的结果却是2条,由于数据量太大不好验证,所以写了个demo来验证。

	public static void main(String[] args) {
		Date startTime = new Date(System.currentTimeMillis());
		SparkUtil sparkUtil = SparkUtil.getInstance();
		JavaSparkContext sparkContext = sparkUtil.getSparkContext(null, "f251");
		HiveContext hiveContext = sparkUtil.getHiveContext(sparkContext.sc());
		
		List<Index> indexList = new ArrayList();
		indexList.add(new Index("F005", "100"));
		indexList.add(new Index("F005", "0.1"));
		indexList.add(new Index("F005", "5"));
		indexList.add(new Index("F005", "0.6"));
		JavaRDD<Index> statMonth0100Rdd = sparkContext.parallelize(indexList);
		Dataset<Row> dataSet = hiveContext.createDataFrame(statMonth0100Rdd, Index.class);
		dataSet.show();
		dataSet.toDF().registerTempTable("F005TB");
		String sql = "select * from F005TB where indexValue>0";
		Dataset<Row> groupPowerDS = sparkUtil.executeSqlHive(hiveContext, sql);
		groupPowerDS.show();
	}

查询结果为:

+---------+----------+
|indexCode|indexValue|
+---------+----------+
|     F005|       100|
|     F005|         5|
+---------+----------+

考虑到可能是类型转换出现了问题,因此修改代码如下:

public static void main(String[] args) {
		Date startTime = new Date(System.currentTimeMillis());
		SparkUtil sparkUtil = SparkUtil.getInstance();
		JavaSparkContext sparkContext = sparkUtil.getSparkContext(null, "f251");
		HiveContext hiveContext = sparkUtil.getHiveContext(sparkContext.sc());
		
		List<Index> indexList = new ArrayList();
		indexList.add(new Index("F005", "100"));
		indexList.add(new Index("F005", "0.1"));
		indexList.add(new Index("F005", "5"));
		indexList.add(new Index("F005", "0.6"));
		JavaRDD<Index> statMonth0100Rdd = sparkContext.parallelize(indexList);
		Dataset<Row> dataSet = hiveContext.createDataFrame(statMonth0100Rdd, Index.class);
		dataSet.show();
		dataSet.toDF().registerTempTable("F005TB");
		String sql = "select * from F005TB where cast(indexValueAS float) >0";
		Dataset<Row> groupPowerDS = sparkUtil.executeSqlHive(hiveContext, sql);
		groupPowerDS.show();
	}

运行结果为:

+---------+----------+
|indexCode|indexValue|
+---------+----------+
|     F005|       100|
|     F005|       0.1|
|     F005|         5|
|     F005|       0.6|
+---------+----------+

修改代码如下:

public static void main(String[] args) {
		Date startTime = new Date(System.currentTimeMillis());
		SparkUtil sparkUtil = SparkUtil.getInstance();
		JavaSparkContext sparkContext = sparkUtil.getSparkContext(null, "f251");
		HiveContext hiveContext = sparkUtil.getHiveContext(sparkContext.sc());
		
		List<Index> indexList = new ArrayList();
		indexList.add(new Index("F005", "100"));
		indexList.add(new Index("F005", "0.1"));
		indexList.add(new Index("F005", "5"));
		indexList.add(new Index("F005", "0.6"));
		JavaRDD<Index> statMonth0100Rdd = sparkContext.parallelize(indexList);
		Dataset<Row> dataSet = hiveContext.createDataFrame(statMonth0100Rdd, Index.class);
		dataSet.show();
		dataSet.toDF().registerTempTable("F005TB");
		String sql = "select * from F005TB where indexValue>0.0";
		Dataset<Row> groupPowerDS = sparkUtil.executeSqlHive(hiveContext, sql);
		groupPowerDS.show();
	}

运行结果为:

+---------+----------+
|indexCode|indexValue|
+---------+----------+
|     F005|       100|
|     F005|       0.1|
|     F005|         5|
|     F005|       0.6|
+---------+----------+

在实际表中查询时不会出现这样的问题
具体的原因和机制有待深入的研究

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值