Копирование данных из нескольких столбцов исходной таблицы кустов в один столбец целевой таблицы кустов в разных строках - PullRequest
1 голос
/ 29 мая 2019

У меня есть требование копировать данные из одной исходной таблицы Hive в другую целевую таблицу. Ниже приведена структура исходной таблицы с примерами данных:

source_table
Userid  Name    Phone1   Phone2  Phone3  Address1   Address2    Address3
123     Jitu    123456   987654  111111  DELHI      GURGAON     NOIDA       
234     Mark    123456   987654  111111  UK         USA         IND

При копировании данных из источника в цель мое требование должно иметь Phone1, Phone2, Phone3 вместе с соответствующими Address1, Address2 и Address3 столбцы в одном столбце в целевой таблице. Ниже показано, как должны выглядеть данные в целевой таблице:

Target_table
Userid  Name    Phone_no    Address
123     Jitu    123456      DELHI
123     Jitu    987654      GURGAON
123     Jitu    111111      NOIDA
234     Mark    123456      UK
234     Mark    987654      USA
234     Mark    111111      IND

Я знаю, что самый простой способ сделать это - сделать несколько вставок в целевую таблицу для каждого столбца Phone и address из исходной таблицы. используя либо язык запросов улья, либо фреймы данных spark.

Есть ли другой эффективный метод, который я могу использовать для достижения этой цели.

Ответы [ 2 ]

4 голосов
/ 29 мая 2019

Исходный кадр данных может быть выбран несколько раз для каждого индекса столбца, а затем выбранные кадры данных объединяются в один «объединением»:

val df = Seq(
  (123, "Jitu", "123456", "987654", "111111", "DELHI", "GURGAON", "NOIDA"),
  (234, "Mark", "123456", "987654", "111111", "UK", "USA", "IND")
).toDF(
  "Userid", "Name", "Phone1", "Phone2", "Phone3", "Address1", "Address2", "Address3"
)

val columnIndexes = Seq(1, 2, 3)
val onlyOneIndexDfs = columnIndexes.map(idx =>
  df.select(
    $"Userid",
    $"Name",
    col(s"Phone$idx").alias("Phone_no"),
    col(s"Address$idx").alias("Address")))

val result = onlyOneIndexDfs.reduce(_ union _)

Вывод:

+------+----+--------+-------+
|Userid|Name|Phone_no|Address|
+------+----+--------+-------+
|123   |Jitu|123456  |DELHI  |
|123   |Jitu|111111  |NOIDA  |
|123   |Jitu|987654  |GURGAON|
|234   |Mark|123456  |UK     |
|234   |Mark|987654  |USA    |
|234   |Mark|111111  |IND    |
+------+----+--------+-------+
2 голосов
/ 04 июля 2019

На всякий случай, если вас также интересует решение Hive, боковое представление дает декартово произведение при объединении набора результатов с несколькими массивами. Вы можете достичь тех же результатов, используя posexplode, как показано ниже:

select Userid,Name,phone,address
from source_table
lateral view posexplode(array(Phone1,Phone2,Phone3))  valphone as x,phone
lateral view posexplode(array(Address1,Address2,Address3)) valaddress as t,address
where x=t
;

hive> set hive.cli.print.header=true;

userid  name    phone   address
123     Jitu    123456  DELHI
123     Jitu    987654  GURGAON
123     Jitu    111111  NOIDA
234     Mark    123456  UK
234     Mark    987654  USA
234     Mark    111111  IND
Time taken: 2.759 seconds, Fetched: 6 row(s)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...