Я ищу идеи о том, как решить ниже сценарий. Мой пример использования - java Искра, но я ищу идеи о том, как сделать это независимо от языка, поскольку у меня закончились идеи
У меня есть неструктурированные данные, как показано ниже
98480|PERSON|TOM|GREER|1982|12|27
98480|PHONE|CELL|732|201|6789
98480|PHONE|HOME|732|123|9876
98480|ADDR|RES|102|JFK BLVD|PISCATAWAY|NJ|08854
98480|ADDR|OFF|211|EXCHANGE PL|JERSEY CITY|NJ|07302
98481|PERSON|LIN|JASSOY|1976|09|15
98481|PHONE|CELL|908|398|3389
98481|PHONE|HOME|917|363|2647
98481|ADDR|RES|111|JOURNAL SQ|JERSEY CITY|NJ|07704
98481|ADDR|OFF|365|DOWNTOWN NEWYORK|NEWYORK CITY|NY|10001
i я пытаюсь преобразовать их в строку с персоной данных с набором телефона и адресом, как показано ниже, в основном одна строка для каждого человекаId
+--------+------+---------+--------+----+-----+---+--------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------+
|personId|type |firstName|lastName|year|month|day|Phone | addr | |
+--------+------+---------+--------+----+-----+---+--------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------+
|98481 |PERSON|LIN |JASSOY |1976|09 |15 |[[PHONE, HOME, 917, 363, 2647], [PHONE, CELL, 908, 398, 3389]] | [[ADDR, OFF, 365, DOWNTOWN NEWYORK, NEWYORK CITY, NY, 10001], [ADDR, RES, 111, JOURNAL SQ, JERSEY CITY, NJ, 07704]] |
|98480 |PERSON|TOM |GREER |1982|12 |27 |[[PHONE, HOME, 732, 123, 9876], [PHONE, CELL, 732, 201, 6789]] | [[ADDR, RES, 102, JFK BLVD, PISCATAWAY, NJ, 08854], [ADDR, OFF, 211, EXCHANGE PL, JERSEY CITY, NJ, 07302]] |
+--------+------+---------+--------+----+-----+---+--------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------+
с кодом ниже
Dataset<Row> dataset = groupedDataset
.agg(collect_set(struct(phoneRow.col("type").as("collType"), phoneRow.col("phoneType").as("phoneType"),
phoneRow.col("areaCode").as("areaCode"), phoneRow.col("phoneMiddle").as("phoneMiddle"),
phoneRow.col("ext").as("ext"), addressRow.col("type").as("collType"),
addressRow.col("addrType").as("addrType"), addressRow.col("addr1").as("rowType"),
addressRow.col("addr2").as("addr2"), addressRow.col("city").as("city"),
addressRow.col("state").as("state"), addressRow.col("zipCode").as("zipCode"))).as("addrPhone"));
вывод ниже, но не в формате, который я ищу
+--------+------+---------+--------+----+-----+---+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|personId|type |firstName|lastName|year|month|day|addrPhone |
+--------+------+---------+--------+----+-----+---+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|98481 |PERSON|LIN |JASSOY |1976|09 |15 |[[PHONE, HOME, 917, 363, 2647, ADDR, OFF, 365, DOWNTOWN NEWYORK, NEWYORK CITY, NY, 10001], [PHONE, HOME, 917, 363, 2647, ADDR, RES, 111, JOURNAL SQ, JERSEY CITY, NJ, 07704], [PHONE, CELL, 908, 398, 3389, ADDR, RES, 111, JOURNAL SQ, JERSEY CITY, NJ, 07704], [PHONE, CELL, 908, 398, 3389, ADDR, OFF, 365, DOWNTOWN NEWYORK, NEWYORK CITY, NY, 10001]]|
|98480 |PERSON|TOM |GREER |1982|12 |27 |[[PHONE, HOME, 732, 123, 9876, ADDR, RES, 102, JFK BLVD, PISCATAWAY, NJ, 08854], [PHONE, CELL, 732, 201, 6789, ADDR, RES, 102, JFK BLVD, PISCATAWAY, NJ, 08854], [PHONE, CELL, 732, 201, 6789, ADDR, OFF, 211, EXCHANGE PL, JERSEY CITY, NJ, 07302], [PHONE, HOME, 732, 123, 9876, ADDR, OFF, 211, EXCHANGE PL, JERSEY CITY, NJ, 07302]] |
+--------+------+---------+--------+----+-----+---+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
ищу идеи для исправления вышеупомянутой проблемы
обновление: я смог получить результат, как и ожидалось, но я не уверен, насколько он эффективен, и похоже, что у него много кода с множеством объединений и фреймов данных. это пример данных, с которыми я играю, чтобы понять искру, но реальные данные, с которыми я бы работал, будут иметь множество сложных преобразований, и этот код не выглядит эффективным
здесь обновленный код
Dataset<Row> groupedPhoneDataSet = groupedDataset.agg(collect_set(struct(phoneRow.col("type").as("phColType"),
phoneRow.col("phoneType").as("phoneType"), phoneRow.col("areaCode").as("areaCode"),
phoneRow.col("phoneMiddle").as("phoneMiddle"), phoneRow.col("ext").as("ext"))).as("phoneRec"));
Dataset<Row> groupedAddrDataSet = groupedDataset
.agg(collect_set(struct(addressRow.col("type").as("addrColType"),
addressRow.col("addrType").as("addrType"), addressRow.col("addr1").as("addr1"),
addressRow.col("addr2").as("addr2"), addressRow.col("city").as("city"),
addressRow.col("state").as("state"), addressRow.col("zipCode").as("zipCode"))).as("addrRec"));
Dataset<Row> finalDataSet = groupedAddrDataSet
.join(groupedPhoneDataSet,
groupedAddrDataSet.col("personId").equalTo(groupedPhoneDataSet.col("personId")))
.select(groupedPhoneDataSet.col("personId"), groupedPhoneDataSet.col("type"),
groupedPhoneDataSet.col("firstName"), groupedPhoneDataSet.col("lastName"),
groupedPhoneDataSet.col("year"), groupedPhoneDataSet.col("month"),
groupedPhoneDataSet.col("day"), col("phoneRec"), col("addrRec"));
вот вывод, который я получил
+--------+------+---------+--------+----+-----+---+--------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------+
|personId|type |firstName|lastName|year|month|day|phoneRec |addrRec |
+--------+------+---------+--------+----+-----+---+--------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------+
|98481 |PERSON|LIN |JASSOY |1976|09 |15 |[[PHONE, CELL, 908, 398, 3389], [PHONE, HOME, 917, 363, 2647]]|[[ADDR, RES, 111, JOURNAL SQ, JERSEY CITY, NJ, 07704], [ADDR, OFF, 365, DOWNTOWN NEWYORK, NEWYORK CITY, NY, 10001]]|
|98480 |PERSON|TOM |GREER |1982|12 |27 |[[PHONE, CELL, 732, 201, 6789], [PHONE, HOME, 732, 123, 9876]]|[[ADDR, OFF, 211, EXCHANGE PL, JERSEY CITY, NJ, 07302], [ADDR, RES, 102, JFK BLVD, PISCATAWAY, NJ, 08854]] |
+--------+------+---------+--------+----+-----+---+--------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------+
есть ли способ, которым я могу сделать это без создания большого количества фреймов данных