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_unionnames,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 - 如何克隆我的行,只更改一个字段?的主要内容,如果未能解决你的问题,请参考以下文章

GridView Webform c#中的行颜色更改

如何对更改位置字段的行重新排序

JS使用扩展运算符克隆对象并更改一个字段[重复]

如何使用来自底层绑定源的行对 datagridview 行执行样式更改?

从克隆切换到新的fork保留更改

如何更改 MySQL 中的自动增量计数器?