我有一个包含时间戳列的日志文件。时间戳采用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;
答案 0 :(得分:37)
Oof,看起来很难看。尝试在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 ...
答案 1 :(得分:7)
随着最新版本的Hive和SparkSQL,可以使用日期和类型转换选项的数据类型。以下应该在Hive以及Spark SQL
中工作SELECT cast(from_unixtime(epoch_datetime) as date) from myHiveTable
答案 2 :(得分:5)
如果您需要以自定义格式转换日期,请使用:
select date_format(from_unixtime(epoch_datetime),'yyyMM') as formatted_date from myHiveTable;
这将返回作为yearMonth的日期,例如201708
答案 3 :(得分:2)
将此查询添加到需要将时间戳转换为字符串分区的日期字符串yyyy-MM-dd的列表中:
return Single.create( e -> {
ArrayList<SomeModel> arrayList = new ArrayList<>();
realm.where(SomeModel.class)
.findAllSortedAsync("createdOn", Sort.DESCENDING)
.asObservable()
.filter(RealmResults::isLoaded)
.subscribe(someModelsAsRealmResult -> {
arrayList.addAll(someModelsAsRealmResult);
e.onSuccess(arrayList);
});
});
答案 4 :(得分:-1)
select order_id, date_format(from_unixtime(order_date/1000),'yyy-MM-dd') as order_date ,order_customer_id,order_status
from orders
或者如果您看到相同的任何错误,请尝试使用 选择order_id,date_format(from_unixtime(order_date DIV 1000),'yyy-MM-dd')作为order_date,order_customer_id,order_status 来自订单