如何在Presto中筛选列内列表包含指定值的DataFrame数据?
问题原因
你编写的过滤语句不生效主要有两点原因:
LIKE运算符默认是字符串精确匹配,不加通配符的情况下只有type值完全等于upload才会被命中,你存储的type内容包含其他字符,自然匹配不到- 从你给出的查询结果来看,
type列是数组类型,字符串匹配逻辑本身不适用于数组的元素包含判断,需要用数组专属的判断语法
不同SQL引擎的实现方案
大数据场景(Spark SQL、Presto/Trino、Hive)
使用内置的array_contains函数判断数组是否包含指定元素:
SELECT value, type FROM dt WHERE array_contains(type, 'upload')
PostgreSQL
支持两种写法实现数组包含判断:
-- 写法1:使用数组包含运算符@> SELECT value, type FROM dt WHERE type @> ARRAY['upload']::varchar[]; -- 写法2:使用ANY关键字匹配 SELECT value, type FROM dt WHERE 'upload' = ANY(type);
MySQL 8.0+(type为JSON数组类型)
使用JSON_CONTAINS函数做JSON数组的元素判断:
SELECT value, type FROM dt WHERE JSON_CONTAINS(type, '"upload"');
特殊兼容方案(type为字符串格式存储的伪数组)
如果你的type列实际是存储为"[increase, upload]"这类字符串格式,没有使用原生数组类型,可以给LIKE加上通配符%做模糊匹配:
SELECT value, type FROM dt WHERE type LIKE '%upload%'
内容的提问来源于stack exchange,提问作者french_fries
相关产品推荐
相关产品推荐

