使用superset,连接hive时(hive的引擎是spark),表名和表信息无法加载,加载出来了一堆表的数据库名
这个问题的原因是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
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添加方言去解决,但是我这里为了偷懒只是改了一下去兼容
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)]
成功