Чтение / доступ к простому двойному массиву из паркета с использованием Spark с использованием Java API
У меня есть файл Parquet, созданный с использованием parquet-avro
библиотека, в которой одно из полей имеет примитивный двойной массив, созданный с использованием следующего типа схемы:
Schema.createArray(Schema.create(Schema.Type.DOUBLE))
Я прочитал эти данные паркета из Spark и применил к ним UDAF (пользовательскую агрегированную функцию). В рамках UDAF org.apache.spark.sql.expressions.UserDefinedAggregateFunction
Я пытаюсь получить доступ к этому полю из org.apache.spark.sql.Row
объект, который передается в качестве параметра функции public void update(MutableAggregationBuffer mutableAggBuff, Row dataRow)
, Однако я не могу получить доступ к примитивному двойному массиву, вместо этого я получаю массив Double[]
который является представлением в штучной упаковке объекта примитивного двойника. Это очень дорогое преобразование объекта данных примитивного двойного массива.
Когда я получаю двойной массив, я получаю в штучной упаковке java.lang.Double
массив вместо примитивного двойного массива. Где-то в коде программы чтения паркетных файлов массив примитивов преобразуется в неэффективный массив двойных объектов. Как я могу предотвратить это дорогостоящее преобразование и получить первозданный двойной массив без изменений? Я могу написать код и преобразовать его обратно в примитивный массив, но объекты Double уже созданы, и это оказывает давление на виртуальную машину.
Единственные API на org.apache.spark.sql.Row
являются:
// This list I can cast as Double type later
List myArrList = row.getList(0);
WrappedArray wr = row.getAs(0);
Нам нужен способ получить примитив double[]
массив без каких-либо дальнейших преобразований. Например:
WrappedArray<scala.Double> wr = row.getAs(0);
double[] myPrimArray = wr.array();
Вопросы:
- Могу ли я настроить Hadoop-parquet reader, чтобы мы могли читать двойной массив как простой двойной массив?
- Есть ли у Spark/Parquet-Hadoop Reader какой-либо способ сделать это без специального кода?