Подход 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 |
+-----+----+-------+