我有一个表如下: 我的目标是将其转换为以下格式: 因此,为此我在 Hive 中使用了横向视图爆炸()函数,如下所示: 但是这样做会跳过 u2 行,因为它在电子邮件中具有空值。 我们如何在输出中也包含空值? 编辑:我正在使用一种解决方法将这个表与基表结合起来而不会爆炸,但我认为数据将因此 ...
提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供 中文繁体 英文版本 中英对照 版本,有任何建议请联系yoyou2525@163.com。
我有一张桌子,如下所示:
user_id email
u1 e1, e2
u2 null
我的目标是将其转换为以下格式:
user_id email
u1 e1
u1 e2
u2 null
HIVE sql:select * FROM表横向视图爆炸(split(email,','))email AS email_id
当在蜂巢中执行上述查询时,我得到的是空值,但是当在spark-sql中运行相同的查询时,我没有得到的是空值,此问题和场景已在此处讨论
Spark sql
:
select * FROM table LATERAL VIEW OUTER explode ( split ( email ,',' ) ) email AS email_id;
select * from table lateral view POSEXPLODE_OUTER(split(email,',')) email as email_id <br>
第二个失败是语法问题,我尝试使用posexplode_outer搜索侧面视图,但无法获得太多结果,我想在spark-sql中引入null。
Spark SQL不使用HiveQL。 它与它部分兼容,但不要误解。 而不是使用LATERAL VIEW
您应该只使用SELECT
Seq(
("u1", "e1, e2"), ("u2", null)
).toDF("user_id", "email").createOrReplaceTempView("table")
spark.sql(
"SELECT user_id, explode_outer(split(email, ',')) FROM table"
).show
// +-------+----+
// |user_id| col|
// +-------+----+
// | u1| e1|
// | u1| e2|
// | u2|null|
// +-------+----+
拆分后添加coalesce
似乎可行
with tmp_table as (
select 'u1' as user, 'e1,e2' as email
union all
select 'u2' as user, NULL as email
)
select * FROM tmp_table
LATERAL VIEW explode ( coalesce(split ( email ,',' ), array(NULL)) ) email AS email_id;
输出
u1 e1,e2 e1
u1 e1,e2 e2
u2 NULL NULL
在Spark 2.2.0中添加了LATERAL VIEW OUTER
例如
scala> spark.sql( | "select * FROM table LATERAL VIEW OUTER explode ( split ( email ,',' ) ) email AS email_id" | ).show +-------+------+--------+
|user_id| email|email_id| +-------+------+--------+ | u1|e1, e2| e1| | u1|e1, e2| e2| | u2| null| null| +-------+------+--------+
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.