SQL - Как я могу клонировать свои строки, меняя только одно поле? - PullRequest
2 голосов
/ 26 марта 2020

Я использую SQL с pyspark и hive, и я новичок во всем этом. У меня в руках проблема, которую я не знаю, как ее решить.

Если у меня есть таблица "Люди", например:

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

Ответы [ 2 ]

0 голосов
/ 28 марта 2020

Начиная с 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|
#+---+-------+
0 голосов
/ 26 марта 2020

Чтобы разбить строку 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
...