开发者社区 > 大数据与机器学习 > 人工智能平台PAI > 正文

在机器学习PAI我用hive catalog读取Hive数据时,该字段数据的精度都不高,怎么处理?

在机器学习PAI我用hive catalog读取Hive数据时,源表有timestamp类型的字段会报 HiveCatalog currently only supports timestamp of precision 9 ,但是我看了下该字段数据的精度,都是不高的。怎么处理?2023-05-31 17:09:46.949 [INFO]: -> Use one of the following commands to start using PyAlink: - useLocalEnv(parallelism, flinkHome=None, config=None): run PyAlink scripts locally. - useRemoteEnv(host, port, parallelism, flinkHome=None, localIp="localhost", config=None): run PyAlink scripts on a Flink cluster. - getMLEnv(): run PyAlink scripts as PyFlink scripts, support 'flink run -py xxx.py'. Call resetEnv() to reset environment and switch to another.

Warning: You're running the script with 'getMLEnv'. You have to manually add Alink jars to PyFlink lib path to make the script work. Traceback (most recent call last): File "/sunrun-scheduler/process/2814a8325c2244a6bd6b4ddca2be56ef/EEF74930058241ADA2131586CBDC2B4B/883D3B4344F043A3AD54F1F64A1828C3/2814a8325c2244a6bd6b4ddca2be56ef_EEF74930058241ADA2131586CBDC2B4B_883D3B4344F043A3AD54F1F64A1828C3_0_node.py", line 70, in fillna_batchOp.link(target_batchOp) File "/data2/anaconda3/envs/alink/lib/python3.6/site-packages/pyalink/alink/common/types/bases/algo_operator.py", line 126, in link return self.linkTo(op) File "/data2/anaconda3/envs/alink/lib/python3.6/site-packages/pyalink/alink/common/types/bases/algo_operator.py", line 116, in linkTo op.linkFrom(self) File "/data2/anaconda3/envs/alink/lib/python3.6/site-packages/pyalink/alink/batch/base.py", line 57, in linkFrom self.get_j_obj().linkFrom(j_args) File "/data1/tools/flink-1.13.3/opt/python/py4j-0.10.8.1-src.zip/py4j/java_gateway.py", line 1286, in call File "/data1/tools/flink-1.13.3/opt/python/pyflink.zip/pyflink/util/exceptions.py", line 146, in deco File "/data1/tools/flink-1.13.3/opt/python/py4j-0.10.8.1-src.zip/py4j/protocol.py", line 328, in get_return_value py4j.protocol.Py4JJavaError: An error occurred while calling o48.linkFrom. : java.lang.RuntimeException: Fail to create table default.maz0irrism6id6cabklm0a at com.alibaba.alink.common.io.catalog.HiveCatalog.checkTableExistenceBeforeSink(HiveCatalog.java:588) at com.alibaba.alink.common.io.catalog.HiveCatalog.sinkBatch(HiveCatalog.java:510) at com.alibaba.alink.operator.batch.sink.CatalogSinkBatchOp.sinkFrom(CatalogSinkBatchOp.java:42) at com.alibaba.alink.operator.batch.sink.CatalogSinkBatchOp.sinkFrom(CatalogSinkBatchOp.java:17) at com.alibaba.alink.operator.batch.sink.BaseSinkBatchOp.linkFrom(BaseSinkBatchOp.java:44) at com.alibaba.alink.operator.batch.sink.BaseSinkBatchOp.linkFrom(BaseSinkBatchOp.java:27) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.apache.flink.api.python.shaded.py4j.reflection.MethodInvoker.invoke(MethodInvoker.java:244) at org.apache.flink.api.python.shaded.py4j.reflection.ReflectionEngine.invoke(R

展开
收起
三分钟热度的鱼 2023-06-05 15:37:32 174 0
3 条回答
写回答
取消 提交回答
  • 公众号:网络技术联盟站,InfoQ签约作者,阿里云社区签约作者,华为云 云享专家,BOSS直聘 创作王者,腾讯课堂创作领航员,博客+论坛:https://www.wljslmz.cn,工程师导航:https://www.wljslmz.com

    该报错提示是因为阿里云机器学习PAI目前只支持精度为9的时间戳类型。而在你的数据中,可能存在精度超过9的时间戳类型,需要检查并作出相应的处理。可以使用Hive函数将时间戳类型按照精度进行转换,例如使用from_unixtime()函数将精度高于9的时间戳转换成精度为9的时间戳。具体方法如下:

    1. 在Hive中创建视图,对时间戳类型字段使用from_unixtime()函数进行转换,转换成精度为秒级的时间戳类型,并且将该视图作为PAI表的数据源。
    2. 将精度高于9的时间戳类型字段转换成日期格式或字符串格式,这样可以避免出现精度问题。
    3. 如果实在无法避免使用精度超过9的时间戳类型字段,可以考虑在本地使用Hive进行处理,然后再将处理后的结果上传到PAI中。
    2023-06-05 22:09:03
    赞同 展开评论 打赏
  • 北京阿里云ACE会长

    对于第一个问题,如果您发现Hive表格中的时间戳字段精度较低,您可以尝试使用Hive的CAST函数将其转换为高精度的时间戳类型,例如:

    SELECT CAST(my_timestamp_field AS TIMESTAMP(6)) FROM my_table
    

    在上面的示例中,将时间戳字段转换为精度为6的TIMESTAMP类型。

    对于第二个问题,根据错误提示,HiveCatalog目前仅支持精度为9的时间戳类型。如果您的Hive表格中的时间戳字段精度低于9,则可能无法使用HiveCatalog将其读取到Flink中。在这种情况下,您可以尝试使用其他的Flink表格源,例如JDBC或CSV表格源。

    另外,从错误日志中的信息来看,可能是因为在创建表格时发生了错误,导致无法将数据写入到表格中。您可以检查表格是否存在,并确保您有足够的权限将数据写入到表格中。

    2023-06-05 21:31:15
    赞同 展开评论 打赏
  • 看了一下逻辑,看起来是在sink创建表的逻辑里,hive这里要求timestamp类型的precision为9,那可能需要用sql将输出类型修改为precision为9(有点困难,我还没找到,需要自己找下)两种方法

    1. 提前创建好表,然后overwriteSink弄成true(这个我没测试过,只是看代码,感觉可行,可以试一下)
    2. https://github.com/alibaba/Alink/blob/c57424780bfe92a313bd09af2f42987e9bfb42e6/core/src/main/java/com/alibaba/alink/common/io/catalog/HiveCatalog.java#L682 这个schema,强行改一下,碰到timestamp类型的,rewrite成precision为9的datatype试一下。此回答整理自钉群“Alink开源--用户群”
    2023-06-05 15:58:51
    赞同 展开评论 打赏

人工智能平台 PAI(Platform for AI,原机器学习平台PAI)是面向开发者和企业的机器学习/深度学习工程平台,提供包含数据标注、模型构建、模型训练、模型部署、推理优化在内的AI开发全链路服务,内置140+种优化算法,具备丰富的行业场景插件,为用户提供低门槛、高性能的云原生AI工程化能力。

相关产品

  • 人工智能平台 PAI
  • 热门讨论

    热门文章

    相关电子书

    更多
    Hive Bucketing in Apache Spark 立即下载
    spark替代HIVE实现ETL作业 立即下载
    2019大数据技术公开课第五季—Hive迁移到MaxCompute最佳实践 立即下载