ambiente:
- Cliente Hive (versión 1.2.1)
- Chispa versión 2.1.1.2.6.1.0-129
Existe una tabla de prueba datadev.t_student, los campos son los siguientes
nombre_col | tipo de datos | comentario |
identificación | cadena | |
puntaje | En t |
En este punto, cuando ejecutemos el siguiente comando en Spark-SQL, se informará un error.
create view datadev.t_student_view as select NVL(id, 'xx') as id from datadev.t_student;
El mensaje de error es el siguiente:
21/12/20 16:57:44 ERROR SparkSQLDriver: Failed in [create view datadev.t_student_view as select NVL(id, 'xx') as id from datadev.t_student]
java.lang.RuntimeException: Failed to analyze the canonicalized SQL: SELECT `gen_attr_0` AS `id` FROM (SELECT nvl(t_student.`id`, 'xx') AS `gen_attr_0` FROM (SELECT `id` AS `gen_attr_1`, `score` AS `gen_attr_2` FROM `datadev`.`t_student`) AS gen_subquery_0) AS gen_subquery_1
Caused by: org.apache.spark.sql.AnalysisException: cannot resolve '`t_student.id`' given input columns: [gen_attr_1, gen_attr_2]; line 1 pos 45;
'Project ['gen_attr_0 AS id#31]
+- 'SubqueryAlias gen_subquery_1
+- 'Project ['nvl('t_student.id, xx) AS gen_attr_0#30]
+- SubqueryAlias gen_subquery_0
+- Project [id#32 AS gen_attr_1#28, score#33 AS gen_attr_2#29]
+- MetastoreRelation datadev, t_student
El análisis del registro de errores aquí muestra que Spark-SQL alias gen_attr_0 para el campo id durante la ejecución, pero gen_attr_0 no se puede obtener en la función NVL, por lo que se informa un error.
Sin embargo, este SQL está bien en Hive SQL Debería ser que hay un problema con el análisis subyacente de Spark-SQL.
Solución: Reemplace la función NVL con la función COALESCE