我在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
2条答案
按热度按时间rsaldnfx1#
从开始
Spark-2.4+:
我们可以用array_union
使names,other_names
将列合并到一个数组中。那么
explode
要创建的列name
列。我们不需要
union all
两个表/DataframeExample:
```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|
+---+-------+
66bbxpm52#
要将csv字符串拆分为行,可以进行横向连接并使用
split()
以及explode()
:如果还需要主名称: