hive Timestamp类型慎用

java.lang.RuntimeException: org.apache.hadoop.hive.ql.metadata.HiveException: Error evaluating regexp_replace(_col3, ':| |-', '')
	at org.apache.hadoop.hive.ql.exec.ExecReducer.reduce(ExecReducer.java:268)
	at org.apache.hadoop.mapred.ReduceTask.runOldReducer(ReduceTask.java:519)
	at org.apache.hadoop.mapred.ReduceTask.run(ReduceTask.java:420)
	at org.apache.hadoop.mapred.Child$4.run(Child.java:255)
	at java.security.AccessController.doPrivileged(Native Method)
	at javax.security.auth.Subject.doAs(Subject.java:396)
	at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1121)
	at org.apache.hadoop.mapred.Child.main(Child.java:249)
Caused by: org.apache.hadoop.hive.ql.metadata.HiveException: Error evaluating regexp_replace(_col3, ':| |-', '')
	at org.apache.hadoop.hive.ql.exec.SelectOperator.processOp(SelectOperator.java:80)
	at org.apache.hadoop.hive.ql.exec.Operator.process(Operator.java:471)
	at org.apache.hadoop.hive.ql.exec.Operator.forward(Operator.java:762)
	at org.apache.hadoop.hive.ql.exec.CommonJoinOperator.genAllOneUniqueJoinObject(CommonJoinOperator.java:761)
	at org.apache.hadoop.hive.ql.exec.CommonJoinOperator.checkAndGenObject(CommonJoinOperator.java:848)
	at org.apache.hadoop.hive.ql.exec.JoinOperator.endGroup(JoinOperator.java:265)
	at org.apache.hadoop.hive.ql.exec.ExecReducer.reduce(ExecReducer.java:198)
	... 7 more
Caused by: java.lang.IllegalArgumentException: nanos > 999999999 or < 0
	at java.sql.Timestamp.setNanos(Timestamp.java:383)
	at org.apache.hadoop.hive.serde2.io.TimestampWritable.populateTimestamp(TimestampWritable.java:348)
	at org.apache.hadoop.hive.serde2.io.TimestampWritable.toString(TimestampWritable.java:320)
	at org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorConverter$TextConverter.convert(PrimitiveObjectInspectorConverter.java:346)
	at org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorConverter$TextConverter.convert(PrimitiveObjectInspectorConverter.java:287)
	at org.apache.hadoop.hive.ql.udf.generic.GenericUDFUtils$ConversionHelper.convertIfNecessary(GenericUDFUtils.java:345)
	at org.apache.hadoop.hive.ql.udf.generic.GenericUDFBridge.evaluate(GenericUDFBridge.java:181)
	at org.apache.hadoop.hive.ql.exec.ExprNodeGenericFuncEvaluator.evaluate(ExprNodeGenericFuncEvaluator.java:163)
	at org.apache.hadoop.hive.ql.exec.SelectOperator.processOp(SelectOperator.java:76)
	... 13 more
### 如何在 Hive 中查询 Hudi 表的 Timestamp 类型字段 为了确保能够在 Hive 中正确查询 Hudi 表中的 `timestamp` 类型字段,需要确认几个配置项已经设置妥当。 #### 配置 Hoodie 同步工具支持 Timestamp 类型 确保 hoodie 数据源同步工具已配置参数 `hoodie.datasource.hive_sync.support_timestamp=true`[^1]。这一步骤对于使 Hive 能够识别并处理来自 Hudi 的 `timestamp` 字段至关重要。默认情况下,如果未启用此选项,则 `timestamp` 可能被误认为是 `bigint` 类型,从而影响 SQL 查询的结果准确性。 #### 处理日期格式转换 考虑到某些场景下,Hudi 会基于字段的内容自动推测其数据类型,例如将形如 `yyyy-mm-dd` 的字符串视为 `timestamp`[^2]。因此,在执行同步操作前可能有必要先利用自定义函数 (UDF) 将特定列的数据从 Unix 时间戳形式转换成更易读的标准日期格式 (`yyyy-MM-dd`)。可以采用如下 Python 函数来完成这一任务: ```python from pyspark.sql.functions import expr, from_unixtime def transform_date(df, column_names): for column_name in column_names: df = df.withColumn(column_name, from_unixtime(expr(f"{column_name}/1000"), "yyyy-MM-dd")) return df ``` 上述代码片段展示了如何创建一个简单的 UDF 来调整 DataFrame 中指定列的时间表示方式,使其更适合于后续分析需求。 #### 执行 Hive 查询语句 一旦完成了以上准备工作之后,就可以像平常一样编写标准的 HiveQL 去访问这些经过适当预处理后的表格了。下面给出了一条基本的例子用于检索某张包含 `timestamp` 列的 Hudi 表记录: ```sql SELECT * FROM hudi_table WHERE CAST(timestamp_column AS TIMESTAMP) BETWEEN &#39;start_time&#39; AND &#39;end_time&#39;; ``` 这里假设目标表名为 `hudi_table` 并且有一个叫做 `timestamp_column` 的时间戳列;同时指定了起始时间和结束时间范围作为过滤条件的一部分。请注意实际应用时应替换具体的表名、列名以及所需的时间区间边界值。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值