【问题标题】:Why I cant use the column name in the alias when i opered with dates为什么我在使用日期操作时不能在别名中使用列名
【发布时间】:2021-06-17 05:08:57
【问题描述】:

目前我正在使用 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 中适用于我,但我不知道为什么在 hive 中不起作用。 Issue ExpectedResult

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

【问题讨论】:

  • 输出 2.019 对我来说没有任何意义。您确定这是您使用的查询吗?
  • 是的,这就是我拍照的问题。我输入了原始问题。
  • 你能举一个例子来说明 FECHA 的价值吗?为什么不按原样保留 FECHA 列并更改 Tableau 中的数据类型。 Tableau 以整数格式识别日期,这样您就不必处理函数和别名。
  • FECHA 采用这种格式 yymmdd->20200101
  • ibb.co/zn6TcVv 有一个例子。

标签: sql apache-spark date hive hiveql


【解决方案1】:

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

【讨论】:

  • 不,我验证并且所有寄存器的格式都正确,没有损坏的日期,您也可以在正常日期下进行相同的练习并且它会连续发生。
  • @Juanjimenez 你能用常数而不是列来重现它吗?请给我一个初始日期的例子
猜你喜欢
  • 2012-06-15
  • 2018-06-19
  • 2013-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-04
相关资源
最近更新 更多