Skip to main content

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编码的字符存在,会被转为乱码,从而视图查询返回不符合预期的结果。

解决方案

  1. 涉及到需要根据中文查询的字段需要转码,例如将中文转码成base64存储到表中, 然后查询时再使用常量的base64进行比对。

  2. 使用外部的Meta Store, 例如使用外部的SQL DB,或者使用MySQL,并且默认的字符集支持'UTF-8'