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_union
将 names,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|
#+---+-------+
我正在将 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_union
将 names,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|
#+---+-------+