最近我發現一個問題,當創建一個拚花表包含一個結構體類型的列有350多字符串分支學科。這樣的表可以通過一個標準的成功創建DDL腳本不過每個後續嚐試與表通過火花。sql結束了一個非法參數異常提示畸形的列定義。你甚至不能放棄,除非你這裏貼使用方法:https://kb.www.eheci.com/metastore/drop-table-corruptedmetadata
我在互聯網上搜索但沒有成功。有一些隱藏的結構體類型定義為拚花和Metastore限製嗎?順便說一句,改變表的格式三角洲有幫助。
這個問題可以複製以下python腳本:
從pyspark。sql進口SparkSession火花= SparkSession.builder.getOrCreate () def generate_unique_strings(數、大小= 5):“”返回發電機獨特的“數”字符串的大小長度”“seen_strings =()而len (seen_strings) <數:new_string = " . join (random.choice (string.ascii_letters) _的範圍(大小)).upper()如果new_string seen_strings: seen_strings.add (new_string)收益率new_string def get_ddl_for_single_struct_table (struct_field_size、tbl_name db_name =“臨時”):“”“返回字符串創建語句表與一個struct struct_field_size字符串字段。”““struct_fields_names = generate_unique_strings (count = struct_field_size) struct_fields = ', '。加入([f“{領域}:字符串”字段struct_fields_names])返回f“創建表{db_name}。{tbl_name}('測試' STRUCT < {struct_fields} >)使用拚花;__main__“if __name__ = =: #創建一個測試數據庫火花。sql(如果不存在創建數據庫臨時)#這將成功-創建一個表與測試結構與300年列字符串字段,顯示其DDL TEST_TABLE_NAME_1 =“struct_size_limit_test_300”STRUCT_SIZE_1 = 300火花。sql (get_ddl_for_single_struct_table (struct_field_size = STRUCT_SIZE_1 tbl_name = TEST_TABLE_NAME_1))火花。sql (f”顯示創建臨時表。{TEST_TABLE_NAME_1}”) #這將產生一個例外-創建一個表與測試結構與500年列字符串字段並試圖展示其DDL。TEST_TABLE_NAME_2 = " struct_size_limit_test_500 " STRUCT_SIZE_2 = 500火花。sql (get_ddl_for_single_struct_table (struct_field_size = STRUCT_SIZE_2 tbl_name = TEST_TABLE_NAME_2))火花。sql (f”顯示創建臨時表。{TEST_TABLE_NAME_2}”)
我