我有3个视图dataset1
、current
和all
。
SELECT
t1.id,
t1.year,
t1.day,
t1.month,
(CASE WHEN t2.id is null then false else true end) as id_present,
(CASE WHEN ((NOT (t1.id IN (SELECT DISTINCT id
FROM all a
WHERE a.dates = current_date - Interval '2' day)))
AND
((t1.click_date = current_date) OR ((t1.count > 0) AND (t1.click_date < (current_date - INTERVAL '12' MONTH)))))
THEN 'Action1'
WHEN ((NOT (t1.id IN (SELECT DISTINCT id
FROM all a
WHERE a.dates = current_date - Interval '2' day)))
AND (t1.count > 0)
AND (t1.click_date < (current_date - INTERVAL '12' MONTH)))
THEN 'Action2'
ELSE 'Action3' END) actions
FROM dataset1 t1 LEFT JOIN current t2 ON t1.id = t2.id
现在我面临的错误是Exception in thread "main" org.apache.spark.sql.AnalysisException: IN/EXISTS predicate sub-queries can only be used in Filter/Join and a few commands:
这个查询在basic SQL中可以正常工作,但在spark SQL中不行,我知道这是因为我在CASE WHEN
中使用了NOT IN
。为了避免这个错误,这个查询的替代方法是什么?
2条答案
按热度按时间vq8itlhq1#
在Spark中,
1.如果
all
中的不同id数量较少,可以使用collect_set()函数创建不同id数组cross join dataset1,然后使用array_contains()函数检查id是否在不同id数组中。下面是查询:
1.如果
all
中的不同id的数量很大,则需要将left join与dataset1
和group by一起使用,以便为t1中的每个id生成一个is_in_all标志。下面是查询:
arknldoa2#
您可以尝试使用此查询。它是您的查询的修改版本,我已将您的
CASE WHEN
中的子查询移动到JOIN
子句,并将NOT IN
替换为NOT EXISTS
表达式。