立即注册 登录
About云-梭伦科技 返回首页

hyj的个人空间 https://www.aboutyun.com/?2 [收藏] [复制] [分享] [RSS]

日志

格式化Hive语法树(python)

已有 763 次阅读2014-5-23 22:07

为了容易看一点,把用explain得到的语法树加上一些缩进.

该代码只是简单的加上缩进.

效果
这是查询explain select key from kv mykv join test mytest on (mykv.key == mytest.id);语句获取的语法树
(TOK_QUERY 
    (TOK_FROM 
        (TOK_JOIN 
            (TOK_TABREF 
                (TOK_TABNAME kv)
             mykv)
 
            (TOK_TABREF 
                (TOK_TABNAME test)
             mytest)
 
            (== 
                (. 
                    (TOK_TABLE_OR_COL mykv)
                 key)
 
                (. 
                    (TOK_TABLE_OR_COL mytest)
                 id)
            )
        )
    )
 
    (TOK_INSERT 
        (TOK_DESTINATION 
            (TOK_DIR TOK_TMP_FILE)
        )
 
        (TOK_SELECT 
            (TOK_SELEXPR 
                (TOK_TABLE_OR_COL key)
            )
        )
    )
)
代码如下
#!/usr/bin/env python
# -*- coding: utf-8 -*-
'''
Created on 2012-5-20
 
@author: fatkun
'''
import sys
 
# explain select key from kv mykv join test mytest on (mykv.key == mytest.id);
original_str = """(TOK_QUERY (TOK_FROM (TOK_JOIN (TOK_TABREF 
(TOK_TABNAME kv) mykv) (TOK_TABREF (TOK_TABNAME test) mytest) 
(== (. (TOK_TABLE_OR_COL mykv) key) (. (TOK_TABLE_OR_COL mytest) id)))) 
(TOK_INSERT (TOK_DESTINATION (TOK_DIR TOK_TMP_FILE)) (TOK_SELECT (TOK_SELEXPR (TOK_TABLE_OR_COL key)))))"""
 
tmp_str = original_str.strip().replace('\n', '')
 
def my_print(mystr):
    sys.stdout.write(mystr)
 
def print_indent(indent_level):
    for i in range(indent_level):
        my_print(' ' * 4)
 
 
indent_level = 0
for char in tmp_str:
    if char == '(':
        # 如果是左括号,先换行,然后打印缩进+(
        my_print('\n')
        print_indent(indent_level)
        my_print(char)
        indent_level += 1
    elif char == ')':
        # 如果是右括号,先打印),再换行,打印下一级别的缩进
        indent_level -= 1
        my_print(char)
        my_print('\n')
        print_indent(indent_level - 1)
    else:
        # 其他的直接打印出来
        my_print(char)




路过

雷人

握手

鲜花

鸡蛋

评论 (0 个评论)

facelist doodle 涂鸦板

您需要登录后才可以评论 登录 | 立即注册

关闭

推荐上一条 /2 下一条