首页 > 解决方案 > 数组中存在于其他两列之间的所有日期的计数

问题描述

我的 JSON 看起来像这样

{"array":["2021-01-17","2021-01-25"], "beginDate": "2021-01-01", "endDate": "2021-01-20"}

我想查找和array之间存在的所有日期的计数。beginDateendDate

我试图在开始日期和结束日期之间创建一系列日期并执行array_intersect. 与此类似:

select size(array_intersect(array("2021-12-02","2021-12-05","2021-12-10"),(sequence(to_date("2021-12-01"), date_add(to_date("2021-12-06"),-1), interval 1 day))))

但我得到:

array_intersect 应该是两个具有相同元素类型的数组,但它是 [array<string>, array<date>]

当我在我的 JSON 上运行它时。

所以我相信我需要将我的数组转换为array<date>. 有什么建议么?

标签: sqlapache-sparkapache-spark-sql

解决方案


您需要确保两个数组都是array<date>. 在您的示例中,第一个数组是array<string>,当您将它与 相交时会导致错误array<date>

select 
    size(
        array_intersect(
            transform(array("2021-12-02","2021-12-05","2021-12-10"), x -> date(x)),
            sequence(to_date("2021-12-01"), date_add(to_date("2021-12-06"), -1), interval 1 day)
        )
    )
;

此查询给出2.


对于您最初的问题,您可以尝试以下查询:

select 
    size(
        array_intersect(
            transform(array, x -> date(x)),
            sequence(to_date(begin), date_add(to_date(end), -1), interval 1 day)
        )
    )
;

推荐阅读