我有一个使用parquet-avro
库生成的Parquet文件,其中一个字段具有原始double数组,该数组是使用以下模式类型创建的:
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[]
的数组,它是原始双精度型的盒装对象表示形式。这是原始双数组数据的非常昂贵的Object转换。
检索双精度数组时,将获得盒装java.lang.Double
数组,而不是原始的双精度数组。在镶木地板阅读器代码中的某个位置,原始数组被转换为内存效率低的Double对象数组。如何防止这种昂贵的转换并保持原始的双精度数组?我可以编写代码并将其转换回原始数组,但是Double对象已经创建,并且给VM带来了GC压力。
org.apache.spark.sql.Row
上唯一的API是:
// 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();