parquet與schema的那點事

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=

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章