問題
您試圖將結構體插入到表中,但是您得到了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命令。