hive - 如何在检查条件时使用 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]
解决方案
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 变量的更多信息
推荐阅读
- excel - 查找范围内的空单元格,然后返回与空单元格在同一行中的另一个单元格的内容
- javascript - 仅在获取数据时加载状态
- python-3.x - 在 TensorFlow 2.0 中使用 tf.keras.optimizers.apply_gradients 方法时出现 TypeError
- reporting-services - 刷新查询设计器中的字段后数据集字段消失 - SSRS VS2017
- scala - 为什么我不能嵌入隐式调用
- ssl - javax.net.ssl.SSLHandshakeException:没有可用的身份验证方案
- sql - 在 Postgres 中使用聚合对嵌套窗口子句进行分组
- c++ - 基于嵌套范围的指针向量循环
- java - Array2d 到 GUI Java Swing
- c# - 从网页源代码中读取特定数据,定制后以网页形式显示