我正在尝试使用配置单元创建外部表。下面是我运行的配置单元查询:
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'?
1条答案
按热度按时间ldioqlga1#
恐怕您需要解析timestamp列,然后将字符串转换为timestamp。例如,
为了方便起见,您可以创建和使用宏函数,例如。,
然后按如下方式使用