У меня есть требование копировать данные из одной исходной таблицы 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
Я знаю, что самый простой способ сделать это - сделать несколько вставок в целевую таблицу для каждого телефона и адресного столбца из исходной таблицы, используя либо язык запросов улья, либо искровые кадры данных.
Есть ли другой эффективный метод, который я могу использовать для достижения этой цели.
2 ответа
На всякий случай, если вас также интересует решение 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)
Исходный кадр данных может быть выбран несколько раз для каждого индекса столбца, а затем выбранные кадры данных объединены в один с помощью «объединения»:
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 |
+------+----+--------+-------+
Новые вопросы
apache-spark
Apache Spark - это механизм распределенной обработки данных с открытым исходным кодом, написанный на Scala, предоставляющий пользователям унифицированный API и распределенные наборы данных как для пакетной, так и для потоковой обработки. Примеры использования Apache Spark часто связаны с машинным / глубоким обучением, обработкой графиков.