SQL - 如何克隆我的行,只更改一个字段?
Posted
技术标签:
【中文标题】SQL - 如何克隆我的行,只更改一个字段?【英文标题】:SQL - How can I clone my rows, changing only one field? 【发布时间】:2020-03-26 18:53:48 【问题描述】:我正在将 SQL 与 pyspark 和 hive 一起使用,而且我对这一切都很陌生。 我手上有一个问题,我不知道如何解决。
如果我有一个表 "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
【问题讨论】:
澄清一下,您有一个“基于分号规则的分隔列表”作为您的列之一,但您希望显示不同的“other_names”作为结果? 【参考方案1】:要将 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
【讨论】:
【参考方案2】:从Spark-2.4+:
我们可以使用array_union
将names,other_names
列组成一个数组。
explode
列创建name
列。
我们不必union all
两个表/数据框
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|
#+---+-------+
【讨论】:
以上是关于SQL - 如何克隆我的行,只更改一个字段?的主要内容,如果未能解决你的问题,请参考以下文章