Azure Databricks上创建View不返回结果
分类: Azure Databricks ◆ 标签: #Databricks ◆ 发布于: 2024-01-16 15:54:13

在Azure Databricks
上创建创建了一个表,如下:
USE default;
DROP TABLE Test1;
CREATE TABLE Test1 (id integer, name varchar(15));
INSERT INTO Test1 (id, name) values (1, "测试1"),
(2, "测试2"),
(3, "测试3"),
(4, "测试4"),
(5, "测试1"),
(6, "测试1"),
(7, "测试1");
SELECT * FROM Test1;
可以返回如下的结果:
然后我们运行条件查询语句:
SELECT * FROM Test1 where name = "测试1";
可以看到结果:
我们继续创建一个视图:
CREATE OR REPLACE VIEW View_Test1 (id, name) AS
SELECT * FROM Test1 where name = "测试1";
SELECT * FROM View_Test1;
然后会惊奇的发现如下的结果:
对比之前的查询语句和视图的定义发现并没有什么不同啊。
这个时候如果您重新检查一下视图的定义:
SHOW CREATE TABLE View_Test1;
会发现:
之前定义的视图查询条件:name = "测试1"
在这里变成乱码了。
原因解析
这是因为首先视图实际上是存储在meta store
里的查询,而Azure Databricks
默认的meta Store
是不支持非ASCII
编码的字符,因此当在视图定义的查询中有非ASCII
编码的字符存在,会被转为乱码,从而视图查询返回不符合预期的结果。
解决方案
涉及到需要根据中文查询的字段需要转码,例如将中文转码成base64存储到表中, 然后查询时再使用常量的base64进行比对。
使用外部的
Meta Store
, 例如使用外部的SQL DB
,或者使用MySQL
,并且默认的字符集支持'UTF-8'