если у меня есть фрейм данных 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 различные схемы для разных разделов записи.
Пожалуйста, дайте мне знать, если я объяснил это плохо