日本在外部metastore字符支持

在外部metastore使用日本字符表。

寫的亞當Pavlacka

去年發表在:2022年5月16日

問題

你想在你的表中使用日文字符,但越來越錯誤。

創建一個表的選項關鍵字

選項提供額外的元數據表。你試著創建一個表選項並指定字符集作為utf8mb4

% sql創建表默認。JPN_COLUMN_NAMES(“作成年月”字符串,“計上年月”字符串,“所屬コード”字符串,“生保代理店コード_8桁的字符串,“所屬名的字符串)使用csv選項(路徑“/ mnt / tabledata / testdata /”,標題“真實”,分隔符“,”,inferSchema“false”, ignoreLeadingWhiteSpace“false”, ignoreTrailingWhiteSpace“false”,多行“真實”,擺脫“\”“字符集”utf8mb4”);

結果是一個錯誤。

在SQL語句錯誤:AnalysisException: org.apache.hadoop.hive.ql.metadata。HiveException: MetaException(信息:javax.jdo。JDODataStoreException: Put請求失敗:插入TABLE_PARAMS (PARAM_VALUE, TBL_ID PARAM_KEY)值(?,?,?)

沒有選項關鍵字創建一個表

你想創建一個表不使用選項

% sql創建表測試。JPN_COLUMN_NAMES(“作成年月”字符串,“計上年月的字符串)使用csv描述擴展test.JPN_COLUMN_NAMES;

表似乎是創建,但列名稱顯示為? ? ? ?而不是使用日本指定的字符。

? ? ? ?在列名。

創建一個表與表表達式

你試著創建一個蜂巢格式表和指定字符集utf8mb4

% sql創建表測試。JPN_COLUMN_NAMES(“作成年月”字符串,“計上年月的字符串)行格式org.apache.hadoop.hive.serde2.lazy SERDE”。與SERDEPROPERTIES LazySimpleSerDe”(“separatorChar”=“,”,“quoteChar”=“\””、“escapeChar " = " \ \ ", " serialization.encoding”=“utf8mb4”) TBLPROPERTIES(“商店。字符集”=“utf8mb4”、“retrieve.charset ' = ' utf8mb4 ');

結果是一個錯誤。

引起的:java.sql。SQLException異常:錯誤的字符串值:“\ xE4 \ xBD \ x9C \ xE6 \ x88 \ x90……在第1行“列”COLUMN_NAME”查詢的方法是:插入COLUMNS_V2 (CD_ID,評論,COLUMN_NAME, TYPE_NAME, INTEGER_IDX)值(6544年,《零》,“作成年月”,“弦”,0)

導致

當創建一個表,一個條目在蜂巢metastore更新。蜂巢metastore通常是一個MySQL數據庫。

創建一個新表時,插入的列的名稱TABLE_PARAMSmetastore。

字符集整理PARAM_VALUETABLE_PARAMSlatin1_bin排序和字符集latin1

% scala executeQuery(“”選擇TABLE_SCHEMA、TABLE_NAME COLUMN_NAME, COLLATION_NAME INFORMATION_SCHEMA。列在TABLE_NAME = TABLE_PARAMS”“”)

Latin1_bin整理形象。

解決方案

latin1沒有支持日本字符,但utf - 8所做的事。

你需要使用外部metastoreUTF-8_bin排序和字符集作為utf - 8

可以使用任何MySQL數據庫5.6或以上作為蜂巢metastore。

對於本例,我們使用MySQL 8.0.13-4。

  1. 創建一個外部Apache蜂巢metastore (AWS|Azure|GCP)。
  2. 創建一個數據庫實例化新的metastore默認表。
    % sql創建數據庫< database_name >
  3. 新創建的表可以探索在外部數據庫對象瀏覽器或者使用命令顯示表。
    % sql——metastore數據庫中運行。在< database_name >顯示表
  4. 檢查在MySQL在表級別排序信息。
    % sql SELECT TABLE_COLLATION, TABLE_NAME、TABLE_TYPE TABLE_COLLATION INFORMATION_SCHEMA。表,TABLE_TYPE像“基地%”
  5. 檢查在MySQL在列級別排序信息。
    % sql SELECT TABLE_SCHEMA, TABLE_NAME、COLUMN_NAME COLLATION_NAME INFORMATION_SCHEMA.COLUMNS
  6. 改變字符集latin1utf - 8
    % sql——metastore數據庫中運行。所有的查詢都是兼容的MySQL。——改變排序和跨數據庫的字符集。改變數據庫< database_name >字符集utf8核對utf8_bin;——修改表排序和字符集。ALTER TABLE < table_name >轉換為字符集utf8核對utf8_bin;——修改排序和字符集列水平。ALTER TABLE < table_name >修改< column_name > <數據類型>字符集utf8核對utf8_bin;
  7. 你現在可以正確認識日本字符顯示表時。
    在列名日語字符。