преобразовать искровой ряд во вложенный java объект - PullRequest
2 голосов
/ 17 января 2020

Я новичок в Spark и пытаюсь преобразовать текстовый файл в java объект. я застрял в том месте, где у меня закончились идеи о том, как преобразовать несколько строк в один java объект.

я читаю ниже образец файла, используя для моего обучения. в приведенном ниже файле первый столбец является personId. personId может повторяться для нескольких строк, если один и тот же человек имеет несколько телефонов и / или несколько адресов.

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

Я преобразую вышеуказанный файл в 3 кадра данных, что-то ниже

JavaRDD<Row> personRDD = textRDD.map((String s) -> s.split("\\|"))
                .filter((a) -> a[1].equalsIgnoreCase("PERSON")).map((v1) -> convertToString(v1))
                .map(str -> RowFactory.create(str.split("\\|")));

        Dataset<Row> personRow = session.createDataFrame(personRDD,
                new StructType().add("personId", DataTypes.StringType).add("type", DataTypes.StringType)
                        .add("firstName", DataTypes.StringType).add("lastName", DataTypes.StringType)
                        .add("year", DataTypes.StringType).add("month", DataTypes.StringType)
                        .add("day", DataTypes.StringType));

        JavaRDD<Row> phoneRDD = textRDD.map((String s) -> s.split("\\|")).filter((a) -> a[1].equalsIgnoreCase("PHONE"))
                .map((v1) -> convertToString(v1)).map(str -> RowFactory.create(str.split("\\|")));

        Dataset<Row> phoneRow = session.createDataFrame(phoneRDD,
                new StructType().add("personId", DataTypes.StringType).add("type", DataTypes.StringType)
                        .add("phoneType", DataTypes.StringType).add("areaCode", DataTypes.StringType)
                        .add("phoneMiddle", DataTypes.StringType).add("ext", DataTypes.StringType));

        JavaRDD<Row> addrRDD = textRDD.map((String s) -> s.split("\\|")).filter((a) -> a[1].equalsIgnoreCase("ADDR"))
                .map((v1) -> convertToString(v1)).map(str -> RowFactory.create(str.split("\\|")));

        Dataset<Row> addressRow = session.createDataFrame(addrRDD,
                new StructType().add("personId", DataTypes.StringType).add("type", DataTypes.StringType)
                        .add("addrType", DataTypes.StringType).add("addr1", DataTypes.StringType)
                        .add("addr2", DataTypes.StringType).add("city", DataTypes.StringType)
                        .add("state", DataTypes.StringType).add("zipCode", DataTypes.StringType));

Теперь у меня есть 3 кадра данных, где я присоединяюсь на основе personid.

Dataset<Row> joinedRow = personRow.join(phoneRow, personRow.col("personId").equalTo(phoneRow.col("personId")))
                .join(addressRow, personRow.col("personId").equalTo(addressRow.col("personId")));

output выглядит примерно так

+--------+------+---------+--------+----+-----+---+--------+-----+---------+--------+-----------+----+--------+----+--------+-----+----------------+------------+-----+-------+
|personId|  type|firstName|lastName|year|month|day|personId| type|phoneType|areaCode|phoneMiddle| ext|personId|type|addrType|addr1|           addr2|        city|state|zipCode|
+--------+------+---------+--------+----+-----+---+--------+-----+---------+--------+-----------+----+--------+----+--------+-----+----------------+------------+-----+-------+
|   98481|PERSON|      LIN|  JASSOY|1976|   09| 15|   98481|PHONE|     CELL|     908|        398|3389|   98481|ADDR|     RES|  111|      JOURNAL SQ| JERSEY CITY|   NJ|  07704|
|   98481|PERSON|      LIN|  JASSOY|1976|   09| 15|   98481|PHONE|     CELL|     908|        398|3389|   98481|ADDR|     OFF|  365|DOWNTOWN NEWYORK|NEWYORK CITY|   NY|  10001|
|   98481|PERSON|      LIN|  JASSOY|1976|   09| 15|   98481|PHONE|     HOME|     917|        363|2647|   98481|ADDR|     RES|  111|      JOURNAL SQ| JERSEY CITY|   NJ|  07704|
|   98481|PERSON|      LIN|  JASSOY|1976|   09| 15|   98481|PHONE|     HOME|     917|        363|2647|   98481|ADDR|     OFF|  365|DOWNTOWN NEWYORK|NEWYORK CITY|   NY|  10001|
|   98480|PERSON|      TOM|   GREER|1982|   12| 27|   98480|PHONE|     CELL|     732|        201|6789|   98480|ADDR|     RES|  102|        JFK BLVD|  PISCATAWAY|   NJ|  08854|
|   98480|PERSON|      TOM|   GREER|1982|   12| 27|   98480|PHONE|     CELL|     732|        201|6789|   98480|ADDR|     OFF|  211|     EXCHANGE PL| JERSEY CITY|   NJ|  07302|
|   98480|PERSON|      TOM|   GREER|1982|   12| 27|   98480|PHONE|     HOME|     732|        123|9876|   98480|ADDR|     RES|  102|        JFK BLVD|  PISCATAWAY|   NJ|  08854|
|   98480|PERSON|      TOM|   GREER|1982|   12| 27|   98480|PHONE|     HOME|     732|        123|9876|   98480|ADDR|     OFF|  211|     EXCHANGE PL| JERSEY CITY|   NJ|  07302|
+--------+------+---------+--------+----+-----+---+--------+-----+---------+--------+-----------+----+--------+----+--------+-----+----------------+------------+-----+-------+

Я пытаюсь преобразовать его в java объект без особого успеха.

мои pojos выглядят примерно так.

public class Person implements Serializable
{
    private String firstName;
    private String lastName;
    private String dateOfBirth;
    private List<Address> addresses = null;
    private List<Phone> phones = null;
......

public class Phone implements Serializable
{

    private String phoneNumber;



public class Address implements Serializable
{
    private String addr1;
    private String addr2;
    private String city;
    private String zipCode;
....

любые идеи о том, как я могу это сделать

...