浏览代码

HUE-7563 [metastore] Fields in nested column have a leading comma when preceded by array in type struct

Romain Rigaux 8 年之前
父节点
当前提交
53807b7
共有 2 个文件被更改,包括 9 次插入0 次删除
  1. 1 0
      apps/metastore/src/metastore/parser.py
  2. 8 0
      apps/metastore/src/metastore/tests.py

+ 1 - 0
apps/metastore/src/metastore/parser.py

@@ -119,6 +119,7 @@ def _split_struct_fields(fields_string):
 
 def _get_next_struct_field(fields_string):
   fieldname, rest = fields_string.split(':', 1)
+  fieldname = fieldname.strip(',')
   balanced = 0
   for pos, char in enumerate(rest):
     balanced += {'<': 1, '>': -1, '(': 1, ')': -1}.get(char, 0)

+ 8 - 0
apps/metastore/src/metastore/tests.py

@@ -513,3 +513,11 @@ class TestParser(object):
     column = {'name': name, 'type': 'array', 'comment': comment, 'item': {'type': 'struct', 'fields': [{'name': 'name', 'type': 'string'}, {'name': 'age', 'type': 'int'}]}}
     parse_tree = parser.parse_column(name, type, comment)
     assert_equal(parse_tree, column)
+
+  def test_parse_nested_with_array(self):
+    name = 'nested'
+    type = 'struct<fieldname1:bigint,fieldname2:int,fieldname3:int,fieldname4:array<bigint>,fieldname5:bigint,fieldname6:array<struct<array_elem:string>>,fieldname7:string>'
+    comment = 'test_parse_nested'
+    column = {'comment': 'test_parse_nested', 'fields': [{'type': 'bigint', 'name': 'fieldname1'}, {'type': 'int', 'name': 'fieldname2'}, {'type': 'int', 'name': 'fieldname3'}, {'item': {'type': 'bigint'}, 'type': 'array', 'name': 'fieldname4'}, {'type': 'bigint', 'name': 'fieldname5'}, {'item': {'fields': [{'type': 'string', 'name': 'array_elem'}], 'type': 'struct'}, 'type': 'array', 'name': 'fieldname6'}, {'type': 'string', 'name': 'fieldname7'}], 'type': 'struct', 'name': 'nested'}
+    parse_tree = parser.parse_column(name, type, comment)
+    assert_equal(parse_tree, column)