數據太長導致列錯誤

如果一個列超過4000個字符,對於默認數據類型來說,它太大了,並返回一個錯誤。

寫的亞當Pavlacka

最後發布日期:2022年5月16日

問題

您試圖將結構體插入到表中,但是您得到了java.sql.SQLException:數據列太長錯誤。

導致:java.sql.SQLException: Data too long for column 'TYPE_NAME' at row 1Insert into columns_v2 (cd_id, comment, ' column_name ', type_name, integer_idx) values (?,?,?,?,?),參數<空>(103182年,“地址”,“結構< street_address1: struct < street_number: int, street_name:字符串,street_type:字符串,國家:字符串,postal_code: string >, street_address2: struct < street_number: int, street_name:字符串,street_type:字符串,國家:字符串,postal_code: string >, street_address3: struct < street_number: int, street_name:字符串,street_type:字符串,國家:字符串,postal_code: string >, street_address4: struct < street_number: int, street_name:字符串,street_type:字符串,國家:字符串,postal_code: string >, street_address5: struct < street_number: int, street_name:字符串,street_type:字符串,國家:字符串,postal_code: string >, street_address6: struct < street_number: int, street_name:字符串,street_type:字符串,國家:字符串,postal_code: string >, street_address7: struct < street_number: int, street_name:字符串,street_type:字符串,國家:字符串,postal_code: string >, street_address8: struct < street_number: int, street_name:字符串,street_type:字符串,清純甜美……at org.mariadb.jdbc.internal.util.LogQueryTool.exceptionWithQuery(LogQueryTool.java:153) at org.mariadb.jdbc.internal.protocol.AbstractQueryProtocol.executeQuery(AbstractQueryProtocol.java:255) at org.mariadb.jdbc.MariaDbPreparedStatementClient.executeInternalBatch(MariaDbPreparedStatementClient.java:368) at org.mariadb.jdbc.MariaDbPreparedStatementClient.executeBatch(MariaDbPreparedStatementClient.java:280)

導致

此問題的根本原因是默認數據類型varchar (4000)對於表中的列。

如果深度嵌套結構的長度超過4000個字符,則會超過默認數據類型的大小,並導致錯誤消息。

您可以通過描述要將數據插入的列來驗證這一點。它將返回一個數據類型varchar (4000)

解決方案

如果要在一列中超過4000個字符,則應該使用外部亞metastore。Databricks Hive metastore的默認數據類型是varchar (4000)並且無法改變。

當您使用外部metastore時,您可以完全控製列和數據庫名稱的長度。您還可以控製列名、數據庫名和表名的排序規則。

回顧外部Apache Hive亞metastore (AWS|Azure|GCP)文檔,學習如何設置外部metastore。

創建了亞metastore表之後,可以直接使用ALTER TABLE命令。