配置单元将时间戳列数据呈现为空

r6vfmomb  于 2021-06-26  发布在  Hive
关注(0)|答案(1)|浏览(347)

我正在尝试使用配置单元创建外部表。下面是我运行的配置单元查询:

create external table trips_raw
(
VendorID int,
tpep_pickup_datetime timestamp,
tpep_dropoff_datetime timestamp
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','  location '/user/taxi_trips/';

当我查看由上述查询创建的“trips\u raw”表的输出时,我发现所有行中的“tpep\u picku\u date\u time”和“tpep\u dropoff\u datetime”列都是“null”。我已经看到其他线程讨论过原因是“1/1/2018 11:13:00 am”时间戳格式不被hive接受,但问题是我在csv源数据中使用的时间戳格式(从这里的屏幕截图可以看到)。

我可以将这两个timestamp列指定为'string',hive将能够正确地呈现它们,但是我仍然希望这两个列是'timestamp'类型,因此将这两个列指定为'string'类型在这里是不可行的。
我也尝试了下面的技术使用这个网站的推荐(https://community.hortonworks.com/questions/55266/hive-date-time-problem.html)但没有成功:
使用'string'作为2个timestamp列的类型,创建'trips\u raw'表。这允许生成的表正确呈现时间戳,尽管是“string”类型。我使用的配置单元命令如下所示:

create external table trips_raw
(
VendorID int,
tpep_pickup_datetime string,
tpep_dropoff_datetime string
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','  location 
'/user/taxi_trips/';

当我查看结果表时,日期显示为字符串,如下面的屏幕截图所示。

但正如我前面提到的,我希望时间列是timestamp类型,而不是string类型。因此,在接下来的两个步骤中,我尝试创建一个空表,然后从步骤1创建的表中插入数据,但这次将字符串转换为时间戳。
使用以下配置单元命令创建名为“trips\u not\u raw”的外部空白表:

create external table trips_not_raw
(VendorID int,
tpep_pickup_datetime timestamp,
tpep_dropoff_datetime timestamp
);

使用下面的配置单元命令,从“trips\u raw”表(本问题前面提到过)插入数据:

insert into table trips_not_raw select vendorid,
from_unixtime(unix_timestamp(tpep_pickup_datetime, 'MM/dd/yyyy HH:mm:ss 
aa')) as tpep_pickup_datetime,
from_unixtime(unix_timestamp(tpep_dropoff_datetime, 'MM/dd/yyyy HH:mm:ss 
aa')) as tpep_dropoff_datetime
from trips_raw;

这样做将行插入到空白表“TrpSyNothBRAW”中,但是从2个时间戳列的结果仍然显示为“NULL”,如您从下面的屏幕截图中可以看到的:

有没有一种简单的方法可以将这两个时间列存储为'timestamp'类型而不是'string',但仍然能够在输出中正确呈现它们,而不会看到'null/none'?

ldioqlga

ldioqlga1#

恐怕您需要解析timestamp列,然后将字符串转换为timestamp。例如,

select cast(regexp_replace('1/1/2018 11:13:00 AM', '(\\d{1,2})/(\\d{1,2})/(\\d{4})\\s(\\d{2}:\\d{2}:\\d{2}) \\w{2}', '$3-$1-$2 $4') as timestamp)

为了方便起见,您可以创建和使用宏函数,例如。,

create temporary macro parse_date (ts string)
  cast(regexp_replace(ts, '(\\d{1,2})/(\\d{1,2})/(\\d{4})\\s(\\d{2}:\\d{2}:\\d{2}) \\w{2}', '$3-$1-$2 $4') as timestamp);

然后按如下方式使用

select parse_date('1/1/2018 11:13:00 AM');

相关问题