Как взорвать массив и создать представление в Hive? - PullRequest
3 голосов
/ 19 июня 2019

У меня есть следующие данные, где id - это целое число, а vectors - это массив:

id, vectors
1, [1,2,3]
2, [2,3,4]
3, [3,4,5]

Я бы хотел разбить столбец vectors с указанием индекса, чтобы он выглядел так:

+---+-----+------+
|id |index|vector|
+---+-----+------+
|1  |0    |1     |
|1  |1    |2     |
|1  |2    |3     |
|2  |0    |2     |
|2  |1    |3     |
|2  |2    |4     |
|3  |0    |3     |
|3  |1    |4     |
|3  |2    |5     |
+---+-----+------+

Я подумал, что могу сделать это, используя Spark Scala, используя selectExpr

df.selectExpr("*", "posexplode(vectors) as (index, vector)")

Однако это относительно простая задача, и я хотел бы избежать написания сценариев ETL и подумал, можно ли использовать это выражение и создать представление для легкого доступа через Presto.

Ответы [ 2 ]

4 голосов
/ 19 июня 2019

Это легко сделать в Presto, используя стандартный синтаксис SQL с UNNEST:

WITH data(id, vector) AS (
    VALUES
    (1, array[1,2,3]),
    (2, array[2,3,4]),
    (3, array[3,4,5])
)
SELECT id, index - 1 AS index, value
FROM data, UNNEST(vector) WITH ORDINALITY AS t(value, index)

Обратите внимание, что индекс, создаваемый WITH ORDINALITY, основан на 1, поэтому явычтите 1 из него, чтобы получить результат, который вы включили в свой вопрос.

0 голосов
/ 19 июня 2019

Вы можете использовать от Lateral view из Hive до explode данных массива.Попробуйте запрос ниже -

select
    id, (row_number() over (partition by id order by col)) -1 as `index`, col as vector
from (
    select 1 as id, array(1,2,3) as vectors from (select '1') t1 union all
    select 2 as id, array(2,3,4) as vectors from (select '1') t2 union all
    select 3 as id, array(3,4,5) as vectors from (select '1') t3
  ) t
LATERAL VIEW explode(vectors) v;
...