首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Spark/RDBMS查询以根据不同的列匹配从单行创建多行

Spark/RDBMS查询以根据不同的列匹配从单行创建多行
EN

Stack Overflow用户
提问于 2019-11-30 05:08:19
回答 3查看 64关注 0票数 1

我有张桌子看起来-

代码语言:javascript
运行
复制
|--|----|------|------|
|id|name|phone1|phone2|
|--|----|------|------|
|1 |abc |123   |567   |
|2 |xyz |766   |980   |
|--|----|------|------|

我需要写一个能给我输出的查询-

代码语言:javascript
运行
复制
|--|----|-----|
|id|name|phone|
|--|----|-----|
|1 |abc |123  |
|1 |abc |567  |
|2 |xyz |766  |
|2 |xyz |980  |
|--|----|-----|

基本上,我正在创建两个电话号码列中的一个列,并重复这些行。有人能帮我查询一下吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-11-30 05:23:05

您可以简单地使用:

代码语言:javascript
运行
复制
Select id, name, phone1 as phone
from tbl
Union all
Select id, name, phone2 as phone
from tbl
票数 4
EN

Stack Overflow用户

发布于 2019-11-30 05:19:17

您可以使用arrayexplode udfs:

代码语言:javascript
运行
复制
df.selectExpr("id", "name", "explode(array(phone1, phone2)) as phone").show
+---+----+-----+
| id|name|phone|
+---+----+-----+
|  1| abc|  123|
|  1| abc|  567|
|  2| xyz|  766|
|  2| xyz|  980|
+---+----+-----+

其中,数组(phone1,phone2)phone1phone2创建一个新的数组列,而爆炸,爆炸数组列将使其平坦,并为原始数组中的每个元素创建一个新的行。

或者,如果您有更多的列,并且需要以编程的方式这样做,那么首先收集需要堆叠或扁平的列,然后使用array udf的varargs语法来收集它们:

代码语言:javascript
运行
复制
val cols = Seq("phone1", "phone2")
// cols: Seq[String] = List(phone1, phone2)

df.select($"id", $"name", explode(array(cols.head, cols.tail: _*)).as("phone")).show
+---+----+-----+
| id|name|phone|
+---+----+-----+
|  1| abc|  123|
|  1| abc|  567|
|  2| xyz|  766|
|  2| xyz|  980|
+---+----+-----+
票数 4
EN

Stack Overflow用户

发布于 2019-11-30 05:47:59

您可以通过简单地使用相同表的UNION ALL来实现这一点。

代码语言:javascript
运行
复制
SELECT id
    ,name
    ,phone1 AS phone
FROM your_Table

UNION ALL

SELECT id
    ,name
    ,phone2 AS phone
FROM your_Table
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59113349

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档