parquet与schema的那点事

在将数据库迁移至Parquet时遇到异常,错误提示缺少OriginalType的nihao枚举。通过源码分析,发现Parquet的schema在解析过程中使用了特定分隔符,如'('和')'。当schema中存在如test(nihao)这样的格式时,由于nihao不属于OriginalType,导致解析错误。解决方案是避免在schema中使用特殊符号如',;{}() ='。" 53689777,5786234,二叉树最短路径到叶子节点算法解析,"['数据结构', '二叉树算法', '深度优先搜索', '递归']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

parquet与schema的那点事

最近做了一个从数据库迁移到parquet报异常的案例,错误如下:

java.lang.IllegalArgumentException:No enum constant org.apache.parquet.schema.OriginalType.nihao total entry:11 java.lang.Enum.valueOf(Unknown Source) 
org.apache.parquet.schema.OriginalType.valueOf(OriginalType.java:21) 
org.apache.parquet.schema.MessageTypeParser.addPrimitiveType(MessageTypeParser.java:163) 
org.apache.parquet.schema.MessageTypeParser.addType(MessageTypeParser.java:112)
org.apache.parquet.schema.MessageTypeParser.addGroupTypeFields(MessageTypeParser.java:100) 
org.apache.parquet.schema.MessageTypeParser.parse(MessageTypeParser.java:93) 
org.apache.parquet.schema.MessageTypeParser.parseMessageType(MessageTypeParser.java:83)

根据错误内容,很明显就是报No enum constant org.apache.parquet.schema.OriginalType.nihao 的错误。

查看OriginalType的源码定义,支持的type里没有nihao,这就是为什么报错:

https://github.com/apache/parquet-mr/blob/master/parquet-column/src/main/java/org/apache/parquet/schema/OriginalType.java

那么nihao是从哪里来的呢?接下来就要查看数据表结构的shema,schema如下:

name
age
test(nihao)

原来nihao来源于test(nihao),那么为什么呢?

继续分析源码:

https://github.com/apache/parquet-mr/blob/master/parquet-column/src/main/java/org/apache/parquet/schema/MessageTypeParser.java

  /**
   *
   * @param input the text representation of the schema to parse
   * @return the corresponding object representation
   */
  public static MessageType parseMessageType(String input) {
    return parse(input);
  }

  private static MessageType parse(String schemaString) {
    Tokenizer st = new Tokenizer(schemaString, " ;{}()\n\t");

原来对schemaString做了parse,new了Tokenizer对象,Tokenizer哪里来的啊?

    public Tokenizer(String schemaString, String string) {
      st = new StringTokenizer(schemaString, " ,;{}()\n\t=", true);
    }

原来来源于StringTokenizer:https://docs.oracle.com/javase/7/docs/api/java/util/StringTokenizer.html#StringTokenizer(java.lang.String,%20java.lang.String,%20boolean)

The set of delimiters (the characters that separate tokens)

,;{}()\n\t=字符就是分隔符啊,分隔符()就是问题的关键,原来如此:

test(nihao)为schema,parseMessageType要parse出type,就是用的分隔符 ,;{}()\n\t=来parse,这里用到的分隔符是(), 由于nihao不是OriginalType中的member,所以报错啊。

解决方法就是避免schema用特殊符号 ,;{}()\n\t=

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值