Hive/SparkSQL查询方式
Hive/Spark SQL query approach
问题陈述:
我在 HDFS 上有大约 400 列的源数据,其中大约 200 列(我将它们称为 VAR1..200)将有可选的数据。有些行可能有 V1..10 的数据,有些可能有 V34..78 等等。我需要读取这些数据并将它们拆分成 2 个文件(如果你愿意,也可以是表)。 Table A 将拥有其他 200 列,Table B 将拥有关于 Table A 中行的 VAR1..200 列的信息。例如,如果 [=26] 中的一行=] A 有 VAR1..20 列的数据,那么 Table B 应该有 20 行,VAR1..20 每行一行,以及 link 表的列。
所以,基本上我需要检查源数据集的 VAR1..200 列,然后如果这些 VAR 中的任何一个有值,我需要在 Table B 中创建一个条目。
在源数据中,这些VAR1..200列以组的形式出现,即VAR1..50一起放在文件中,然后在其他一些列之后,VAR51..100一起存储等等
我必须使用 HiveQL 或 Spark Core 或 Spark SQL 来实现它,最好是 Spark 解决方案。
我认为的方法是使用Spark Core,通过索引读取VAR1..200,检查值,然后将其移动到不同的数据集。
我想知道如何最好地实施这样的解决方案。请分享您的想法。谢谢
演示
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 |
+-----+----+-------+
问题陈述: 我在 HDFS 上有大约 400 列的源数据,其中大约 200 列(我将它们称为 VAR1..200)将有可选的数据。有些行可能有 V1..10 的数据,有些可能有 V34..78 等等。我需要读取这些数据并将它们拆分成 2 个文件(如果你愿意,也可以是表)。 Table A 将拥有其他 200 列,Table B 将拥有关于 Table A 中行的 VAR1..200 列的信息。例如,如果 [=26] 中的一行=] A 有 VAR1..20 列的数据,那么 Table B 应该有 20 行,VAR1..20 每行一行,以及 link 表的列。 所以,基本上我需要检查源数据集的 VAR1..200 列,然后如果这些 VAR 中的任何一个有值,我需要在 Table B 中创建一个条目。
在源数据中,这些VAR1..200列以组的形式出现,即VAR1..50一起放在文件中,然后在其他一些列之后,VAR51..100一起存储等等
我必须使用 HiveQL 或 Spark Core 或 Spark SQL 来实现它,最好是 Spark 解决方案。
我认为的方法是使用Spark Core,通过索引读取VAR1..200,检查值,然后将其移动到不同的数据集。
我想知道如何最好地实施这样的解决方案。请分享您的想法。谢谢
演示
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 |
+-----+----+-------+