Запись Java RDD в несколько папок с различными схемами - PullRequest
0 голосов
/ 03 января 2019

если у меня есть фрейм данных Spark, я могу при записи очень легко разбить данные на несколько папок, используя метод partitionBy () объекта DataFrameWriter.

Но моя отправная точка на самом деле - JavaRDD. Опять же, легко преобразовать JavaRDD в фрейм данных, используя статический createDataFrame (JavaRDD rdd, Class clsT) класса SparkSession.

Чтобы это работало, класс clsT должен быть классом bean-типа. Пока все хорошо, это работает для меня.

Теперь у моего класса бобов есть следующие поля со следующими примерами значений

String partitionFieldOne = "a";
String partitionFieldTwo = "b";
String id = "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"
String data = "field1: value1, field2: value2, field3: value3, ..."

Теперь у меня проблема в следующем. При записи в таком секционированном виде все объекты EJB, записанные в одну и ту же папку, будут иметь одинаковые поля в строке данных (field1a, field2a, field3a и т. Д.), Но объект EJB, записанный в другую папку, будет иметь другой набор полей в строке данных (field1b, field2b, field3b и т. д.).

Это означает, что я мог бы сэкономить значительное дисковое пространство, если бы мог включать эти имена полей как часть схемы. В настоящее время все точки данных, записанные в один файл (я пишу в паркет, но я уверен, что вопрос сохраняется для записи в другие форматы), имеют одинаковые наборы полей, и поэтому половина информации в строке данных ( поля) повторяется для каждой точки данных.

Имена этих полей (они на самом деле представляют собой длинные значения, представляющие временные метки) становятся известными только во время выполнения и будут развиваться со временем, поэтому я не могу создать семейство классов Java-бинов для каждого набора полей, которые могут существовать.

Что я хочу знать, так это то, можно ли иметь возможность писать секционированным образом, имея разные схемы для каждого отдельного раздела?

Я знаю, что могу разделить свой RDD (в этом одном абзаце я использую слово разбиение в традиционном смысле для Spark, в котором я указываю, какие точки данных в RDD находятся в каких узлах), а затем использую forEachPartition () метод JavaRDD для отдельной записи каждого файла в каждой папке, но мне было бы интересно узнать, допускает ли DataFrameWriter различные схемы для разных разделов записи.

Пожалуйста, дайте мне знать, если я объяснил это плохо

...