有人可以解释 arrayJoin() 函数在 Clickhouse 数据库中如何工作吗?

Abh*_*dan 3 database clickhouse

我是 ClickHouse DB 的新手,文档中提供的示例无助于正确理解这个概念。解释如何在简单场景中使用arrayjoin()将不胜感激。

vla*_*mir 5

让我们考虑以下场景:

\n
    \n
  1. 当需要将数组转换为关系(行集)时
  2. \n
\n
/* get error */\nSELECT 1\nWHERE 1 IN ([1, 2]);\n\n/* ok */\nSELECT 1\nWHERE 1 IN (SELECT arrayJoin([1, 2]));\n
Run Code Online (Sandbox Code Playgroud)\n
/* get error */\nSELECT *\nFROM (SELECT [1, 2] a)\nWHERE a = 2;\n\n/* ok */\nSELECT *\nFROM (SELECT arrayJoin([1, 2]) a)\nWHERE a = 2;\n
Run Code Online (Sandbox Code Playgroud)\n
    \n
  1. 展开/展平行
  2. \n
\n
SELECT\n    metric_id,\n    metric_name,\n    arrayJoin(metric_values) AS metric_value\nFROM\n( /* test data */\n    SELECT\n        1 AS metric_id,\n        \'name_1\' AS metric_name,\n        [1, 4, 55] AS metric_values\n    UNION ALL\n    SELECT\n        2 AS metric_id,\n        \'name_2\' AS metric_name,\n        [-7, 11] AS metric_values\n)\n/* result\n\xe2\x94\x8c\xe2\x94\x80metric_id\xe2\x94\x80\xe2\x94\xac\xe2\x94\x80metric_name\xe2\x94\x80\xe2\x94\xac\xe2\x94\x80metric_value\xe2\x94\x80\xe2\x94\x90\n\xe2\x94\x82         1 \xe2\x94\x82 name_1      \xe2\x94\x82            1 \xe2\x94\x82\n\xe2\x94\x82         1 \xe2\x94\x82 name_1      \xe2\x94\x82            4 \xe2\x94\x82\n\xe2\x94\x82         1 \xe2\x94\x82 name_1      \xe2\x94\x82           55 \xe2\x94\x82\n\xe2\x94\x82         2 \xe2\x94\x82 name_2      \xe2\x94\x82           -7 \xe2\x94\x82\n\xe2\x94\x82         2 \xe2\x94\x82 name_2      \xe2\x94\x82           11 \xe2\x94\x82\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xb4\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xb4\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x98\n*/\n
Run Code Online (Sandbox Code Playgroud)\n
/* produce Cartesian product */\nSELECT\n    arrayJoin([1, 2]) AS n,\n    arrayJoin([\'a\', \'b\']) AS ll,\n    arrayJoin([\'A\', \'B\']) AS ul\n/* result\n\xe2\x94\x8c\xe2\x94\x80n\xe2\x94\x80\xe2\x94\xac\xe2\x94\x80ll\xe2\x94\x80\xe2\x94\xac\xe2\x94\x80ul\xe2\x94\x80\xe2\x94\x90\n\xe2\x94\x82 1 \xe2\x94\x82 a  \xe2\x94\x82 A  \xe2\x94\x82\n\xe2\x94\x82 1 \xe2\x94\x82 a  \xe2\x94\x82 B  \xe2\x94\x82\n\xe2\x94\x82 1 \xe2\x94\x82 b  \xe2\x94\x82 A  \xe2\x94\x82\n\xe2\x94\x82 1 \xe2\x94\x82 b  \xe2\x94\x82 B  \xe2\x94\x82\n\xe2\x94\x82 2 \xe2\x94\x82 a  \xe2\x94\x82 A  \xe2\x94\x82\n\xe2\x94\x82 2 \xe2\x94\x82 a  \xe2\x94\x82 B  \xe2\x94\x82\n\xe2\x94\x82 2 \xe2\x94\x82 b  \xe2\x94\x82 A  \xe2\x94\x82\n\xe2\x94\x82 2 \xe2\x94\x82 b  \xe2\x94\x82 B  \xe2\x94\x82\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xb4\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xb4\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x98\n*/\n
Run Code Online (Sandbox Code Playgroud)\n
/* flatten the multidimension array */\nSELECT arrayJoin(arrayJoin([[1, 2], [3, 4]])) AS d\n/* result\n\xe2\x94\x8c\xe2\x94\x80d\xe2\x94\x80\xe2\x94\x90\n\xe2\x94\x82 1 \xe2\x94\x82\n\xe2\x94\x82 2 \xe2\x94\x82\n\xe2\x94\x82 3 \xe2\x94\x82\n\xe2\x94\x82 4 \xe2\x94\x82\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x98\n*/\n
Run Code Online (Sandbox Code Playgroud)\n
\n

当您需要逐项链接数组而不是获取笛卡尔积时,请考虑使用ARRAY JOIN

\n
/* cartesian product */\n\nSELECT\n    arrayJoin(arr1),\n    arrayJoin(arr2)\nFROM\n(\n    SELECT\n        [1, 2] AS arr1,\n        [11, 22] AS arr2\n)\n\n/*\n\xe2\x94\x8c\xe2\x94\x80arrayJoin(arr1)\xe2\x94\x80\xe2\x94\xac\xe2\x94\x80arrayJoin(arr2)\xe2\x94\x80\xe2\x94\x90\n\xe2\x94\x82               1 \xe2\x94\x82              11 \xe2\x94\x82\n\xe2\x94\x82               1 \xe2\x94\x82              22 \xe2\x94\x82\n\xe2\x94\x82               2 \xe2\x94\x82              11 \xe2\x94\x82\n\xe2\x94\x82               2 \xe2\x94\x82              22 \xe2\x94\x82\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xb4\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x98\n*/\n\n\n/* connect array\'s item one by one */\n\nSELECT a1, a2, arr1, arr2\nFROM\n(\n    SELECT\n        [1, 2] AS arr1,\n        [11, 22] AS arr2\n)\nARRAY JOIN arr1 as a1, arr2 as a2\n\n/*\n\xe2\x94\x8c\xe2\x94\x80a1\xe2\x94\x80\xe2\x94\xac\xe2\x94\x80a2\xe2\x94\x80\xe2\x94\xac\xe2\x94\x80arr1\xe2\x94\x80\xe2\x94\x80\xe2\x94\xac\xe2\x94\x80arr2\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x90\n\xe2\x94\x82  1 \xe2\x94\x82 11 \xe2\x94\x82 [1,2] \xe2\x94\x82 [11,22] \xe2\x94\x82\n\xe2\x94\x82  2 \xe2\x94\x82 22 \xe2\x94\x82 [1,2] \xe2\x94\x82 [11,22] \xe2\x94\x82\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xb4\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xb4\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xb4\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x98\n*/\n
Run Code Online (Sandbox Code Playgroud)\n