【问题标题】:Spark: How to include null rows in lateral view explodeSpark:如何在横向视图中包含空行爆炸
【发布时间】:2019-03-17 19:46:26
【问题描述】:

我有一张如下表:

user_id email
u1      e1, e2
u2      null

我的目标是将其转换为以下格式:

user_id email
u1      e1
u1      e2
u2      null

HIVE sql: select * FROM table LATERAL VIEW explode(split(email,',')) email AS email_id

当在 hive 中执行上述查询时,我得到了空值,但是当在 spark-sql 中运行同样的查询时,我没有得到空值,这个问题和场景已经讨论过here

火花sql:

  1. select * FROM table LATERAL VIEW OUTER explode ( split ( email ,',' ) ) email AS email_id;
  2. select * from table lateral view POSEXPLODE_OUTER(split(email,',')) email as email_id <br>

第二个是语法问题失败,我尝试使用posexplode_outer搜索横向视图但没有得到太多结果,我想在spark-sql中引入空值。

【问题讨论】:

  • spark sql中的第一个查询有什么问题?第二个函数posexplode_outer 无效。
  • @VamsiPrabhala:即使在运行第一个查询后,我也无法在结果中看到 NULL,“SELECT POSXPLODE_OUTER(array(10,20)) AS (POS,SO);”这在 spark-sql 中运行
  • @sramalingam24:是的,我之前已经检查过了,但它是 wrt 数据帧,我需要在 spark-sql 查询中实现
  • 您在 spark SQL 中编写的所有内容都可用作数据框函数,因此从一个到另一个只是语义

标签: apache-spark hive apache-spark-sql hiveql


【解决方案1】:

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|
// +-------+----+

【讨论】:

  • 这可以扩展到下面的 hiveql: "select * from table LATERAL VIEW POSEXPLODE(split(ORDER_NUMBER,',')) NOS AS pos,ORDER_NUMBER_SPLIT?
【解决方案2】:

在拆分后添加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

【讨论】:

    【解决方案3】:

    在 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| +-------+------+--------+

    【讨论】:

      猜你喜欢
      • 2017-04-04
      • 2017-07-13
      • 1970-01-01
      • 2023-03-06
      • 2018-12-21
      • 1970-01-01
      • 1970-01-01
      • 2016-11-20
      相关资源
      最近更新 更多