开发者社区 > 大数据与机器学习 > 大数据计算 MaxCompute > 正文

maxcompute查询外部表insert到内部表报错,两表字段一致

详细错误如下:
ODPS-0123131:User defined function exception - Traceback:
java.lang.NumberFormatException: For input string: "\N"
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
at java.lang.Long.parseLong(Long.java:589)
at java.lang.Long.parseLong(Long.java:631)
at com.aliyun.odps.udf.impl.builtin.storagehandler.BuiltinTextExtractor.textLineToRecord(BuiltinTextExtractor.java:274)
at com.aliyun.odps.udf.impl.builtin.storagehandler.BuiltinTextExtractor.extract(BuiltinTextExtractor.java:233)
at com.aliyun.odps.udf.ExtractorHandler.next(ExtractorHandler.java:149)
外部表是加载的oss的csv目录,insert into a select * from b limit 100这样没有问题,这个上面的错误也不知道具体是读到哪列报错,每个CSV文件又是大文件,难排查啊

展开
收起
游客v6k662hqfyfdq 2023-12-08 17:00:51 45 0
3 条回答
写回答
取消 提交回答
  • 面对过去,不要迷离;面对未来,不必彷徨;活在今天,你只要把自己完全展示给别人看。

    根据您提供的错误信息,问题可能出在外部表读取CSV文件时,遇到了一个无法转换为数字的字符串("\N")。这可能是由于CSV文件中的某些列包含非数字字符导致的。

    为了解决这个问题,您可以在将数据插入到内部表之前,对外部表中的数据进行清洗和转换。例如,您可以使用REGEXP_REPLACE函数替换掉非数字字符,然后再进行插入操作。以下是一个示例:

    INSERT INTO 内部表 (字段1, 字段2, ...)
    SELECT
        REGEXP_REPLACE(字段1, '[^0-9]', '') AS 字段1,
        REGEXP_REPLACE(字段2, '[^0-9]', '') AS 字段2,
        ...
    FROM
        外部表;
    

    这样,您就可以避免因为非数字字符导致的错误,并成功将数据从外部表插入到内部表中。

    2023-12-09 11:01:40
    赞同 1 展开评论 打赏
  • 根据错误信息,这个问题看起来是由于解析外部表数据时发生了数值格式错误。错误中提到了一个 "\N" 的输入字符串,导致无法将其转换为数字类型。

    有几种可能的原因和解决方法:

    1. 数据格式错误:确保您的外部表数据与内部表的字段类型匹配。检查外部表数据中是否包含不符合预期的数据格式,例如某些列应该是数字类型,但实际上包含了 "\N" 或其他非数字字符。

    2. 自定义函数(UDF):如果在查询过程中使用了自定义函数,检查自定义函数的逻辑是否正确处理了数据类型,避免出现异常情况。

    3. 数据源问题:检查外部表的数据源文件,确保每一行的数据都符合预期的格式和数据类型。

    4. 异常数据过滤:考虑对加载数据进行预处理,例如在加载数据前先通过脚本或工具进行数据质量检查和筛选,以排除可能引发异常的数据。

    5. 分步调试:如果问题仍然存在,并且难以确定具体是哪一列引发了错误,可以尝试分步调试。例如,逐个字段地插入数据,确定在哪个字段上出现了错误,并进一步定位问题。

    2023-12-08 19:55:02
    赞同 展开评论 打赏
  • 十分耕耘,一定会有一分收获!

    楼主你好,看了你的问题,应该是在UDF中,将 "\N" 转化为数字类型的时候出现了NumberFormatException异常,导致UDF失败,也就是说在读取外部表数据时,某些列中包含了 "\N" 这个不合法的数字类型数据,而ODPS无法将其转化为数字类型。

    所以在处理外部表数据时,你可以使用IF语句或CASE语句对 "\N" 进行特殊处理,可以将其替换为 null 值或其他默认值,举个例子,示例代码:
    image.png

    SELECT IF(col1 = '\N', NULL, col1) AS col1, 
           IF(col2 = '\N', 0, CAST(col2 AS BIGINT)) AS col2, 
           ...
    FROM external_table
    

    而且也可以使用 CASE 语句对多个列中的 "\N" 进行处理:

    image.png

    SELECT CASE
             WHEN col1 = '\N' THEN NULL
             ELSE col1
           END AS col1,
           CASE
             WHEN col2 = '\N' THEN 0
             ELSE CAST(col2 AS BIGINT)
           END AS col2,
           ...
    FROM external_table
    

    这样,在遇到异常数据时,就可以通过处理外部表中的数据,使其符合内部表的数据类型需求。

    2023-12-08 19:30:48
    赞同 展开评论 打赏

MaxCompute(原ODPS)是一项面向分析的大数据计算服务,它以Serverless架构提供快速、全托管的在线数据仓库服务,消除传统数据平台在资源扩展性和弹性方面的限制,最小化用户运维投入,使您经济并高效的分析处理海量数据。

相关产品

  • 云原生大数据计算服务 MaxCompute
  • 相关电子书

    更多
    大数据AI一体化的解读 立即下载
    极氪大数据 Serverless 应用实践 立即下载
    大数据&AI实战派 第2期 立即下载