SQL - 如何克隆我的行,只更改一个字段?

SQL - How can I clone my rows, changing only one field?

我正在将 SQL 与 pyspark 和 hive 一起使用,而且我是新手。 我手上有个问题不知道怎么解决

如果我有 table "People" ,像这样:

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

"other_names" 列中的姓名数量是可变的。它可以是 1,2,3,....

我想创建一个查询来获取这个:

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

有什么不太复杂的方法吗?

提前非常感谢您,编码愉快:D

要将 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

Spark-2.4+:

开始

我们可以使用 array_unionnames,other_names 列组成一个数组。

  • 然后explode列创建name列。
  • 我们不必union all两个tables/dataframes

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