尝试使用superset连接spark-sql,superset官方文档只提到使用推荐使用pyhive
,但是怎么连接,并没有详细说明,经过研究superset issues,结合自己的经验推测尝试,成功实现连接。
由于网上资料较少,在此记录,以做备忘,同时希望能够帮助遇到同样问题的道友。
连接方法
1、首先启动spark的thrift服务
2、superset连接spark-sql,SQLALCHEMY URI填写格式如下:
hive://<spark-master-host>:10000/iceberg
spark-master-host
可以从spark web ui查看。
iceberg
是spark catalog名称,如果不指定,默认为default
。
问题
这种方式连接上spark-sql后,superset的sqllab可以正常通过spark查询数据,也可以正常显示数据库列表,但是无法正常显示数据表列表。
这是因为spark-sql展示数据表列表时,会显示两列,第一列是数据表所在的数据库的名称,第二列才是数据表名称,而pyhive默认选择第一列数据返回,所以在superset中,数据表列表显示不正确。
这个问题是pyhive的问题,因为pyhive不直接支持spark-sql。
如果想解决这个问题,这里提供三种思路:
1、修改pyhive,在hive方言中增加返回数据的判断,如果展示数据有两列,则返回第二列。
这里提供pyhive一个发布版的代码位置:pyhive v0.6.3 代码位置
最新版本,代码或有变动。
2、修改pyhive,增加spark方言。
3、使用hive外部表。
这里第三种思路是使用hive外部表,是因为我的使用场景是数据湖场景,架构是spark+iceberg,这时可以在hive中创建iceberg的外部表,然后superset通过hive查询iceberg的数据。