Использование Spark 2.2 + Java 1.8
У меня есть два пользовательских типа данных "Foo" и "Bar". Каждый из них реализует serializable. У 'Foo' есть отношение один ко многим с 'Bar', поэтому их отношения представлены в виде кортежа:
Tuple2<Foo, List<Bar>>
Как правило, когда у меня есть отношение 1: 1, я могу кодировать свои собственные типы следующим образом:
Encoder<Tuple2<Foo,Bar>> fooBarEncoder = Encoders.tuple(Encoders.bean(Foo.class),Encoders.bean(Bar.class));
и затем используйте для кодирования моего набора данных
Dataset<Tuple2<Foo,Bar>> fooBarSet = getSomeData().as(fooBarEncoder);
Но у меня возникают проблемы с поиском способа кодирования для сценария, когда у меня есть список (или массив) в качестве элемента Tuple2. Я хотел бы предоставить кодировщик для второго элемента, например:
Encoder<Tuple2<Foo,List<Bar>>> fooBarEncoder = Encoders.tuple(Encoders.bean(Foo.class), List<Bar>.class);
и затем закодировать в мой набор данных:
Dataset<Tuple2<Foo,List<Bar>>> fooBarSet = getSomeData().as(fooBarEncoder)
Но, очевидно, я не могу вызвать .class для параметризованного типа, такого как List
Я знаю, что для строковых и примитивных типов массивы поддерживаются искровыми следствиями, например ::1010 *
sparkSession.implicits().newStringArrayEncoder()
Но как бы я создал кодировщик для List или Array пользовательского типа класса?