sql-如何克隆行,只更改一个字段?

dkqlctbz  于 2021-06-25  发布在  Hive
关注(0)|答案(2)|浏览(401)

我在pyspark和hive中使用sql,我对所有这些都是新手。我手里有个问题,我不知道怎么解决。
如果我有一张“人”的table,像这样:

id |  name   | other_names
1  |  Alice  | Sarah;Tom
2  |  Bob    | Jane;Michael;Ben
3  | Lizzie  | John

“其他名称”列中的名称数是可变的。它可以是1,2,3,。。。。
我想创建一个查询来获取:

id   |  name
1    |  Alice
1    |  Sarah
1    |  Tom
2    |  Bob 
2    |  Jane
2    |  Michael
2    |  Ben
3    |  Lizzie
3    |  John

有没有一个不太复杂的方法?
提前非常感谢,很高兴编码:d

rsaldnfx

rsaldnfx1#

从开始 Spark-2.4+: 我们可以用 array_union 使 names,other_names 将列合并到一个数组中。
那么 explode 要创建的列 name 列。
我们不需要 union all 两个表/Dataframe Example: ```
df=spark.createDataFrame([("1","Alice","Sarah;Tom"),("2","Bob","Jane;Micheal;Ben"),("3","Lizzie","John")],["id","name","other_names"])

from pyspark.sql.functions import *

df.withColumn("new",array_union(array(col("name")),split(col("other_names"),";"))).
select("id",explode("new").alias("name")).
show()

+---+-------+

| id| name|

+---+-------+

| 1| Alice|

| 1| Sarah|

| 1| Tom|

| 2| Bob|

| 2| Jane|

| 2|Micheal|

| 2| Ben|

| 3| Lizzie|

| 3| John|

+---+-------+

66bbxpm5

66bbxpm52#

要将csv字符串拆分为行,可以进行横向连接并使用 split() 以及 explode() :

select t.id, n.other_name
from mytable t
lateral view explode(split(t.other_names, ';')) n as other_name

如果还需要主名称:

select id, name from mytable
union all
select t.id, n.other_name
from mytable t
lateral view explode(split(t.other_names, ';')) n as other_name

相关问题