Hive/Spark SQL 查询方法

Posted

技术标签:

【中文标题】Hive/Spark SQL 查询方法【英文标题】:Hive/Spark SQL query approach 【发布时间】:2017-02-17 17:52:11 【问题描述】:

问题陈述: 我在 HDFS 上有大约 400 列的源数据,其中大约 200 列(我将它们称为 VAR1..200)将有可选的数据。有些行可能包含 V1..10 的数据,有些行可能包含 V34..78 等。我需要读取这些数据并将它们分成 2 个文件(或表,如果你愿意的话)。表 A 将包含其他 200 列,表 B 将包含有关表 A 中行的 VAR1..200 列的信息。例如,如果表 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    |
+-----+----+-------+

【讨论】:

谢谢嘟嘟。我忘记了 Hive 中的横向视图 :)

以上是关于Hive/Spark SQL 查询方法的主要内容,如果未能解决你的问题,请参考以下文章

Hadoop,Hive,Spark 之间是啥关系

无法从 impala/hive/spark sql 访问“spark 注册表”

计算 Hive/Spark/SQL 中的每小时进程计数

将数据写入 Hive Spark SQL 时出现 ArrayIndexOutOfBoundsException 异常

Flume+Spark+Hive+Spark SQL离线分析系统

Flume+Spark+Hive+Spark SQL离线分析系统