hive指定格式导出数据和Hive时间函数时区问题

579 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

hive指定格式导出数据

语法格式

beeline -n username -p password \
-u jdbc:hive2://hadoop01:10000/cdm \
--verbose=true  \
--showHeader=false \
--outputformat=tsv2  \
--color=true  \
-e "select * from ${database}.${tablename}" > ${tableName}.csv

或者

beeline -n username -p password \
--outputformat=table \
-u jdbc:hive2://hadoop01:10000/cdm \
-e "select * from ${database}.${tablename}" > ${tableName}.csv

通过 outputformat 指定输出格式

--outputformat=[table/vertical/csv/tsv/dsv/csv2/tsv2] == 指定输出格式 --delimiterForDSV="*" 前提(–outputformat=dsv) 指定分隔符

不同格式对应的分隔符如下表:

格式分隔符
table表格式
vertical垂直模式
csv',' 逗号(元素包含引号)
tsv'\t' 制表符(元素包含逗号)
dsv默认'|' 竖线分割,可通过delimiterForDSV指定分隔符
csv2',' 逗号(不含引号)
tsv2'\t' 制表符(不含引号)

说明:

csv格式 == 查询元素有’'单引号 csv2格式没有单引号 tsv,tsv2同上

多分隔符实例 hive '*' 星号分割 (元素包含双引号)

beeline -n username -p password \
-u jdbc:hive2://hadoop01:10000/cdm \
--showHeader=false \
--outputformat=dsv \
--delimiterForDSV="*" \
-e 'SELECT  concat("\"", self_acc_name,"\"") ,  concat("\"",self_acc_no ,"\"")  FROM ${database}.${tablename}" > ${tableName}.csv
beeline -n hive -p hive \
-u jdbc:hive2://hadoop01:10000/cdm \
--showHeader=true \
--outputformat=dsv \
--delimiterForDSV="|" \
-e "select * from  t1 where ds >= '20220101' and ds < '20220201'  and id=37 order by \`time\` " > t1.txt

Hive时间函数时区问题

hive的时间函数

  1. 取得当前日期

select current_date();

  1. 取得当前日期时间

select current_timestamp();

-- 获取当前日期 UTC 默认时区
SELECT CURRENT_TIMESTAMP() 
-- 假设给定的时间戳是UTC并转换为给定的时区(从Hive 0.8.0开始)UTC 默认时区 转为 GMT+8 上海时区
SELECT from_utc_timestamp(CURRENT_TIMESTAMP,'GMT+8') 
-- 假设给定时间戳在给定时区内并转换为UTC(从Hive 0.8.0开始) 设置为GMT-8 时区 再转为 UTC 默认时区
SELECT to_utc_timestamp(CURRENT_TIMESTAMP,'GMT-8') 
  1. 取得当前时间

select from_unixtime(unix_timestamp(),'yyyy-MM-dd HH:mm:ss');

获取的是HiveService所在操作系统RTC(时钟芯片)时间,如下 实例1:

在这里插入图片描述 在这里插入图片描述 实例2: 在这里插入图片描述在这里插入图片描述