首页 > 解决方案 > 为什么我在使用日期操作时不能在别名中使用列名

问题描述

目前我正在使用 HIVE_SQL 将数据库从 SQL_SERVER 迁移到 SPARK。

当我尝试将数字传递给日期格式时遇到问题。我发现答案是:

from_unixtime(unix_timestamp(cast(DATE as string) , 'dd-MM-yyyy'))

当我执行这个查询时,它会给我带来数据,请注意我放置了一个不同于 FECHA 列名称的别名:

SELECT FROM_UNIXTIME(UNIX_TIMESTAMP(CAST(FECHA AS STRING ) ,'yyyyMMdd'), 'yyyy-MM-dd') AS FECHA_1
FROM reportes_hechos_avisos_diarios
LIMIT 1

|   FECHA_1    | 
| --------     |
| 2019-01-01   |

但是当我使用与列名相同的别名时,它会给我带来一个不一致的信息:

SELECT FROM_UNIXTIME(UNIX_TIMESTAMP(CAST(FECHA AS STRING ) ,'yyyyMMdd'), 'yyyy-MM-dd')  AS FECHA
FROM reportes_hechos_avisos_diarios
LIMIT 1

|  FECHA   | 
| -------- |
| 2.019    |

我知道简单的答案是,放置一个与列名不同的别名,但是我在 Tableau 中有一个从这个查询提供的实现,并且更改这些列很复杂,因为基本上我必须更改所有实现,所以我需要保留列名。此查询在 SQL SERVER 中适用于我,但我不知道为什么在配置单元中不起作用。 问题 预期结果

PSDT:感谢您的关注,这是我在堆栈中提出的第一个问题,我的母语不是英语,如果我有语法错误,请见谅。

标签: sqlapache-sparkdatehivehiveql

解决方案


limit 1没有order by可能会在运行之间产生不确定的结果,因为行的顺序由于并行执行是随机的,某些因素可能会以某种方式影响它,但不能保证获得相同的行。

发生了什么 - 我猜您收到不同的行并且该行中的日期已损坏,这就是返回一些奇怪结果的原因。

此外,您可以使用另一种转换方法:

select date(regexp_replace(cast(20200101 as string),'(\\d{4})(\\d{2})(\\d{2})','$1-$2-$3')) --put your column instead of constant.

结果:

2020-01-01

推荐阅读