我有张桌子看起来-
|--|----|------|------|
|id|name|phone1|phone2|
|--|----|------|------|
|1 |abc |123   |567   |
|2 |xyz |766   |980   |
|--|----|------|------|我需要写一个能给我输出的查询-
|--|----|-----|
|id|name|phone|
|--|----|-----|
|1 |abc |123  |
|1 |abc |567  |
|2 |xyz |766  |
|2 |xyz |980  |
|--|----|-----|基本上,我正在创建两个电话号码列中的一个列,并重复这些行。有人能帮我查询一下吗?
发布于 2019-11-30 05:23:05
您可以简单地使用:
Select id, name, phone1 as phone
from tbl
Union all
Select id, name, phone2 as phone
from tbl发布于 2019-11-30 05:19:17
您可以使用array和explode udfs:
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)从phone1和phone2创建一个新的数组列,而爆炸,爆炸数组列将使其平坦,并为原始数组中的每个元素创建一个新的行。
或者,如果您有更多的列,并且需要以编程的方式这样做,那么首先收集需要堆叠或扁平的列,然后使用array udf的varargs语法来收集它们:
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|
+---+----+-----+发布于 2019-11-30 05:47:59
您可以通过简单地使用相同表的UNION ALL来实现这一点。
SELECT id
    ,name
    ,phone1 AS phone
FROM your_Table
UNION ALL
SELECT id
    ,name
    ,phone2 AS phone
FROM your_Tablehttps://stackoverflow.com/questions/59113349
复制相似问题