24

我有一个包含时间戳列的日志文件。时间戳采用 unix 纪元时间格式。

我想根据带有分区年、月和日的时间戳创建一个分区。

到目前为止,我已经这样做了,但它抛出了一个错误。

PARSE ERROR cannot recognize input '(' in column type

这是我的代码。

from (
      from raw_data
            MAP  ${PREFIX}raw_data.line
            USING 's3://scripts/clean.py'
            AS (timestamp STRING, name STRING)
      ) map_out
INSERT OVERWRITE TABLE date_base_data_temp PARTITION(year(timestamp), month(timestamp)), day(timestamp))) 
    select map_out.name;
4

5 回答 5

56

哎呀,看起来很难看。尝试在 Hive 中使用此功能:

SELECT from_unixtime(unix_timestamp) as new_timestamp from raw_data ...

或者如果时间戳在ms而不是秒:

SELECT from_unixtime(unix_timestamp DIV 1000) as new_timestamp from raw_data ...

这会将 unix 时间戳转换为 YYYY-MM-DD HH:MM:SS 格式,然后您可以使用以下函数来获取年、月和日:

SELECT year(new_timestamp) as year, month(new_timestamp) as month, day(new_timestamp) as day ...
于 2011-09-23T16:01:12.553 回答
12

随着 Hive 和 SparkSQL 的最新版本,日期和类型转换选项的数据类型可用。以下应该在 Hive 和 Spark SQL 中工作

SELECT cast(from_unixtime(epoch_datetime) as date) from myHiveTable
于 2016-06-14T22:07:35.270 回答
8

如果您需要以自定义格式转换日期,请使用以下命令:

select date_format(from_unixtime(epoch_datetime),'yyyyMM') as formatted_date from myHiveTable;


它将日期返回为 yearMonth 例如 201708

于 2017-08-11T10:54:09.200 回答
4

将此查询添加到需要将时间戳转换为字符串分区的日期字符串 yyyy-MM-dd 的列表中:

hive> select date_format(from_unixtime(epoch_datetime), 'yyyy-MM-dd') as day from table_name limit 20;

-- If required, remove the millis precision for timestamps
hive> select date_format(from_unixtime(cast(epoch_datetime/1000 as bigint)), 'yyyy-MM-dd') as day from table_name limit 20;
于 2017-12-27T00:15:11.853 回答
-1
select order_id, date_format(from_unixtime(order_date/1000),'yyy-MM-dd') as order_date ,order_customer_id,order_status
from orders

或者如果您看到任何错误,请尝试使用 select order_id, date_format(from_unixtime(order_date DIV 1000),'yyy-MM-dd') as order_date ,order_customer_id,order_status from orders

于 2018-10-07T14:39:01.850 回答