首页 > 解决方案 > 失败:ClassCastException primitive.WritableConstantStringObjectInspector 无法转换为primitive.BooleanObjectInspector

问题描述

在我的配置单元查询中,我使用第一种方法得到了正确的输出,但是第二种语法失败了,不确定我到底错过了什么,但它一定是一些次要的东西。

方法 - 1

SELECT  FLAG
        CASE WHEN flag = 'A' THEN 'Active'
            WHEN flag = 'B' THEN 'Inactive'
            WHEN flag = 'C' THEN 'Inactive'
            WHEN flag = 'D' THEN 'Inactive'
            WHEN flag = 'E' THEN 'Inactive'
            WHEN flag = 'F' THEN 'Inactive'
            WHEN flag = 'G' THEN 'Inactive'
            WHEN flag = 'H' THEN 'Inactive'
            WHEN flag = 'I' THEN 'Inactive'
            WHEN flag = 'J' THEN 'Inactive'
            WHEN flag = 'K' THEN 'Inactive'
            WHEN flag = 'L' THEN 'Inactive'
       ELSE ''
       END AS FINAL_FLAG,
       NAME,
       PHONE_NUMBER
  FROM TEST_WORKER_TABLE;

+-------+--------------+------------+---------------+
| FLAG  | FINAL_FLAG   | NAME       | PHONE_NUMBER  |
+-------+--------------+------------+---------------+
| A     | Active       | MARK K     | 123-456-7890  |
| B     | Inactive     | Raj V      | 123-456-7890  |
| C     | Inactive     | Nick B     | 123-456-7890  |
| L     | Inactive     | Elainee L  | 123-456-7890  |
| K     | Inactive     | Kim K      | 123-456-7890  |
+-------+--------------+------------+---------------+

方法 - 2

SELECT FLAG
       CASE WHEN flag = 'A' THEN 'Active'
            WHEN flag = 'B' OR 'C' OR 'D' OR 'E' OR 'F' OR 'G' OR 'H' OR 'I' OR 'J' OR 'K' OR 'L' THEN 'Inactive'
       ELSE ''
       END AS FINAL_FLAG,
       NAME,
       PHONE_NUMBER
  FROM TEST_WORKER_TABLE;

Error: Error while compiling statement: FAILED: ClassCastException org.apache.hadoop.hive.serde2.objectinspector.primitive.WritableConstantStringObjectInspector cannot be cast to org.apache.hadoop.hive.serde2.objectinspector.primitive.BooleanObjectInspector (state=42000,code=40000)

有什么建议么 ?

标签: hiveql

解决方案


使用 IN 子句而不是 OR 子句。

SELECT FLAG
       CASE WHEN flag = 'A' THEN 'Active'
            WHEN flag IN ('B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L') THEN 'Inactive'
       ELSE ''
       END AS FINAL_FLAG,
       NAME,
       PHONE_NUMBER
  FROM TEST_WORKER_TABLE;

推荐阅读