exception:java.util.concurrent.ExecutionException: java.sql.SQLException: Query failed (#20230529_064057_04028_847se): line 210:44: Column 'array_v' cannot be resolved
时间: 2024-02-05 22:04:11 浏览: 24
根据错误信息来看,问题出在了 `array_v` 这个列上。这很可能是因为 `array_v` 这个列名是由 `UNNEST` 函数生成的,而在主查询中无法直接引用。您可以尝试将 `UNNEST` 函数的结果用一个别名来指定列名,然后在 `LEFT JOIN` 中使用这个别名来引用它。例如:
```
SELECT
a.pick_date,
a.pick_region_nm,
a.pick_park_nm,
b.type1,
b.type2,
b.type3,
b.type4,
a.target_1,
a.target_2,
a.target_3
FROM (
SELECT
pick_date,
pick_region_nm,
pick_park_nm,
split(array_concat, ',') as array_values
FROM tmp_03
) a
CROSS JOIN UNNEST(a.array_values) AS t(array_v)
LEFT JOIN tmp.pick_analysis_map b ON split(t.array_v, '#')[1] = b.type
```
在这个版本中,我们使用 `AS t(array_v)` 将 `UNNEST` 函数的结果列命名为 `array_v`,并在 `LEFT JOIN` 中使用 `t.array_v` 来引用它。这样就可以避免 `array_v` 这个列无法解析的问题了。
相关问题
presto报错exception:java.util.concurrent.ExecutionException: java.sql.SQLException: Query failed (#20230529_063701_03996_847se): line 202:9: Column 'array_v' cannot be resolved
根据错误信息来看,问题出在了 `UNNEST` 这个函数上,Presto 无法解析 `array_v` 这个列名。这很可能是因为 `array_v` 这个列是在子查询中定义的,而在主查询中却无法访问。
一种解决方法是将子查询中对 `array_v` 的访问移动到主查询中。可以先将子查询中的 `SPLIT` 函数提升到主查询中,然后再对其结果进行 `UNNEST` 函数的操作。可以尝试一下下面的语句:
```
SELECT
a.pick_date,
a.pick_region_nm,
a.pick_park_nm,
b.type1,
b.type2,
b.type3,
b.type4,
a.target_1,
a.target_2,
a.target_3
FROM (
SELECT
pick_date,
pick_region_nm,
pick_park_nm,
split(array_concat, ',') as array_values
FROM tmp_03
) a
CROSS JOIN UNNEST(a.array_values) AS array_v
LEFT JOIN tmp.pick_analysis_map b ON split(array_v, '#')[1] = b.type
```
这里将子查询中的 `SPLIT` 函数提升到了主查询中,并将其结果作为一个数组 `array_values` 返回。然后在 `CROSS JOIN` 中对 `array_values` 进行了 `UNNEST` 操作,得到了一个列名为 `array_v` 的新列。最后在 `LEFT JOIN` 中通过 `split(array_v, '#')[1]` 来匹配 `b.type`。
SELECT * FROM tmp_03 CROSS JOIN UNNEST(array_concat) AS t(array_v)exception:java.util.concurrent.ExecutionException: java.sql.SQLException: Query failed (#20230529_064552_04073_847se): Cannot unnest type: varchar
根据错误信息,看起来 `array_concat` 这个列是一个 `varchar` 类型的列,而 `UNNEST` 函数只能用于数组类型 (`array`) 或者是映射类型 (`map`) 的列。因此,需要将 `array_concat` 这个列转换成数组类型之后才能使用 `UNNEST` 函数。
如果 `array_concat` 这个列中的每个元素都是由 `#` 分隔的多个值,您可以尝试使用 `split` 函数将其转换成数组类型。例如:
```
SELECT
*
FROM (
SELECT
pick_date,
pick_region_nm,
pick_park_nm,
split(array_concat, ',') as array_values
FROM tmp_03
) a
CROSS JOIN UNNEST(a.array_values) AS t(array_v)
```
在这个版本中,我们使用 `split` 函数将 `array_concat` 列中的每个元素转换成数组类型。然后在主查询中,我们可以使用 `CROSS JOIN UNNEST` 的方式将数组中的每个元素展开成一行数据,从而实现了将一个列中的多个值拆分成多行的效果。
请注意,在这个版本中,您需要使用 `a.array_values` 来引用 `split` 函数生成的数组列。同时,也需要注意到在 `CROSS JOIN UNNEST` 函数中,我们使用了别名 `t(array_v)` 来指定展开后的列名为 `array_v`,以便在后续的查询中使用。