Подход SQL-запросов Hive/Spark

Постановка проблемы: у меня есть исходные данные о HDFS, которые имеют приблизительно 400 столбцов, из которых около 200 столбцов (я назову их VAR1..200) будут иметь данные по выбору. Некоторые строки могут иметь данные для V1..10, а некоторые могут иметь V34..78 и так далее. Мне нужно прочитать эти данные и разбить их на 2 файла (или таблицы, если хотите). Таблица A будет содержать другие 200 столбцов, а таблица B будет содержать информацию о столбцах VAR1..200 для строк в таблице A. Например, если строка в таблице A содержит данные для столбцов VAR1..20, то таблица B должна иметь 20 строк, по одной строке для VAR1..20, а также столбцы для связи таблиц. Итак, по сути, мне нужно проверить столбцы VAR1..200 исходного набора данных, а затем, если любой из этих VAR имеет значения, мне нужно создать запись в таблице B.

В исходных данных эти столбцы VAR1..200 появляются в группах, т.е. VAR1..50 помещаются вместе в файл, затем после некоторых других столбцов сохраняются вместе VAR51..100 и т. Д.

Я должен реализовать это, используя HiveQL или Spark Core или Spark SQL, предпочтительно решения Spark.

Я подумал, что нужно использовать Spark Core, прочитать VAR1..200 по индексу, проверить значение и затем переместить его в другой набор данных.

Я хотел знать, как лучше всего реализовать такое решение. Пожалуйста, поделитесь своими мыслями. Благодарю.

1 ответ

Решение

демонстрация

create table mytable (id bigint,var1 string,var2 string,var3 string,var4 string,var5 string,var6 string,var7 string,var8 string,var9 string,var10 string);

insert into mytable values 
    (123,null,null,null,'DD','EE','FF','GG',null,null,null)
   ,(456,null,null,null,null,null,null,null,null,'II','JJ')
;   

select * from mytable;

+------------+--------------+--------------+--------------+--------------+--------------+--------------+--------------+--------------+--------------+---------------+
| mytable.id | mytable.var1 | mytable.var2 | mytable.var3 | mytable.var4 | mytable.var5 | mytable.var6 | mytable.var7 | mytable.var8 | mytable.var9 | mytable.var10 |
+------------+--------------+--------------+--------------+--------------+--------------+--------------+--------------+--------------+--------------+---------------+
|        123 | NULL         | NULL         | NULL         | DD           | EE           | FF           | GG           | NULL         | NULL         | NULL          |
|        456 | NULL         | NULL         | NULL         | NULL         | NULL         | NULL         | NULL         | NULL         | II           | JJ            |
+------------+--------------+--------------+--------------+--------------+--------------+--------------+--------------+--------------+--------------+---------------+

select  id
       ,v.i + 1 as i
       ,v.val

from    mytable
        lateral view posexplode (array(var1,var2,var3,var4,var5,var6,var7,var8,var9,var10)) v as i,val

where   v.val is not null
;

+-----+----+-------+
| id  | i  | v.val |
+-----+----+-------+
| 123 |  4 | DD    |
| 123 |  5 | EE    |
| 123 |  6 | FF    |
| 123 |  7 | GG    |
| 456 |  9 | II    |
| 456 | 10 | JJ    |
+-----+----+-------+
Другие вопросы по тегам