首页 > 解决方案 > 如何在检查条件时使用 double 和 float 类型修复 Hive 查询问题,(在转换时遇到问题)

问题描述

我正在尝试运行一个基本的配置单元查询来选择高于阈值的值。名为“corr_coeff”的列类型是浮点类型,但是通过 hiveview2.0 或通过 zepelin(通过 JDBC 驱动器)的配置单元查询语言总是通过我的相等检查作为双精度,我得到错误。

FilterPredicate 列:corr_coeff 的声明类型 (java.lang.Double) 与文件元数据中找到的模式不匹配。列 corr_coeff 的类型为:FLOAT

我尝试为阈值设置一个新变量并进行转换,但这也不起作用。

set PROB_THRESH=(cast 0.70 as float);
select corr_coeff FROM trends where trends.corr_coeff>PROB_THRESH;

然后我得到错误:

org.apache.hive.service.cli.HiveSQLException:编译语句时出错:FAILED:SemanticException [错误 10004]:第 1:54 行无效的表别名或列引用“PROB_THRESH”:(可能的列名是:索引、文件名、start_trnd , end_trnd, start_trnd_time, end_trnd_time, feature1, feature2, corr_coeff)

编辑:更新 8/21

所以我发现如果我将整个列最初作为浮点数转换为双精度列,它会起作用,但这是一种资源浪费。

set PROB_THRESH=0.70;
select corr_coeff FROM trends WHERE cast(trends.corr_coeff as double) >${hiveconf:PROB_THRESH};

我想要但总是失败的是将比较中的阈值转换为浮点数,因为 Hive 将变量初始化为双精度

use fca_analytics;
set PROB_THRESH=0.70;
select corr_coeff FROM trends WHERE trends.corr_coeff > cast(${hiveconf:PROB_THRESH} as float);

这失败了:

FilterPredicate 列:corr_coeff 的声明类型 (java.lang.Double) 与文件元数据中找到的模式不匹配。列 corr_coeff 的类型为:FLOAT 此列的有效类型为:[class java.lang.Float]

标签: hivehiveql

解决方案


PROB_THRESH是一个 Hive 变量。

使用以下语法引用 Hive 变量,${hiveconf:myvariable}

因此,您的代码必须修改为,

set PROB_THRESH=0.70;
select corr_coeff FROM trends where trends.corr_coeff > ${hiveconf:PROB_THRESH};

您可以在https://cwiki.apache.org/confluence/display/Hive/LanguageManual+VariableSubstitution上阅读有关 hive 变量的更多信息


推荐阅读