Superset sqllab连接hive无法显示表信息的问题

2022-10-17 10:37:33 浏览数 (1)

一、问题

使用superset,连接hive时(hive的引擎是spark),表名和表信息无法加载,加载出来了一堆表的数据库名

二、解决问题

1、原因

这个问题的原因是superset里面是使用pyhive去连接,表名加载是通过"show tables in {dbname}"去获取的,而spark sql和hive sql的"show tables"的执行返回结果格式不一样,pyhive最新版本20.0.1并没有支持spark的方言,平时使用没问题,但是放在使用superset去连接的时候,表名显示就混乱。

spark sql

hive sql

然后我们找到pyhive关于show tables的代码,位置:~/python3.8/site-packages/pyhive/sqlalchemy_hive.py

代码语言:javascript复制
def get_table_names(self, connection, schema=None, **kw):
        query = 'SHOW TABLES'
        if schema:
            query  = ' IN '   self.identifier_preparer.quote_identifier(schema)

        return [row[0] for row in connection.execute(query)]

这里单纯的时候第一列作为table name返回,这里的话可以给spark添加方言去解决,但是我这里为了偷懒只是改了一下去兼容

代码语言:javascript复制
def get_table_names(self, connection, schema=None, **kw):
        query = 'SHOW TABLES'
        if schema:
            query  = ' IN '   self.identifier_preparer.quote_identifier(schema)

        # spark sql table name in row[1], hive sql table name in row[0]
        return [row[1] if len(row) > 1 else row[0] for row in connection.execute(query)]
        # return [row[0] for row in connection.execute(query)]

成功

0 人点赞