Я новичок в 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;
....
любые идеи о том, как я могу это сделать