我有一张桌子,如下所示:

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

  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中引入null。

#1楼 票数:3

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

#2楼 票数:1

拆分后添加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楼 票数:0

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

  ask by Vinod translate from so

未解决问题?本站智能推荐:

1回复

从 spark 中读取使用 CTE(With 子句)创建的 Hive 视图

我对使用 CTE(WITH 子句)创建的 Hive 有一个视图,该视图合并两个表,然后计算以仅显示每个 id 的最新记录。 在我的环境中,我有一个浏览 hive 数据库的工具(DBeaver,非 datalake 开发者必须浏览数据)。 查看代码 CREATE VIEW IF NOT EX
1回复

Spark:Hive查询

我有一个日志文件,第一列将是我在Hive表中的分区。 如何构造查询以选择第一列(在此处标记为?)并确保我在分区中选择的那个与第二个选择(*)匹配?
1回复

选择Hive和Spark的count(*)问题

运行ANALYZE语句后,我得到了正确的计数。 但是我的问题是,每次更新计数时都需要运行它。 从技术上讲,我应该能够更新同一分区的计数。 但是,如果我不执行ANALYZE语句,它将返回相同的计数。 这是我执行的要更新计数的查询。 而且执行根本不方便。 有任何想法吗?
2回复

Spark 分区 Hive 表

我正在尝试使用不同的时间戳对配置单元表进行分区。 我有一个带有时间戳的表,但是当我执行 hive 分区查询时,它说它不是有效的分区列。 这是表: 这是我得到的错误:
1回复

如何使用Spark筛选Hive中的记录

为什么刺痛没有得到比较? 我的输入为- 我正在查询- 输出是- y在DDL中声明为字符串类型
1回复

Spark / Hive UDAF可按键获取不同的值

在大数据处理中,通常希望在不更改现有查询结构(分组,子查询等)的情况下 “素描”组的摘要。 在Spark SQL(和HiveQL)中, collect_set是执行此操作的collect_set的示例。 它为每个组构建一​​个列的唯一值的数组。 我正在寻找一个UDAF,它为B列的每个唯
4回复

在Spark中获取Hive表的HDFS位置

我正在尝试使用以下查询从Spark中的Hive分区表中解析出Location: 我无法在Spark中找到任何查询或任何其他方式来专门从此查询中选择“位置”列。
4回复

Spark 2:调用 SparkSession enableHiveSupport() 时它是如何工作的

我的问题很简单,但不知何故,我无法通过阅读文档找到明确的答案。 我在CDH 5.10集群上运行Spark2 。 还有 Hive 和一个 Metastore。 我在 Spark 程序中创建了一个会话,如下所示: 假设我有以下 HiveQL 查询: 我想知道是否: 在幕后,这个查询被翻