我有一个使用该parquet-avro
库生成的 Parquet 文件,其中一个字段具有原始双精度数组,使用以下模式类型创建:
Schema.createArray(Schema.create(Schema.Type.DOUBLE))
我从 Spark 中读取了这个 parquet 数据,并在其上应用了 UDAF(用户定义的聚合函数)。在 UDAForg.apache.spark.sql.expressions.UserDefinedAggregateFunction
中,我试图从org.apache.spark.sql.Row
对象访问该字段,该对象作为参数传递给函数public void update(MutableAggregationBuffer mutableAggBuff, Row dataRow)
。但是,我无法访问原始双精度数组,而我得到的是一个数组,Double[]
该数组是原始双精度的装箱对象表示。这是原始双精度数组数据的非常昂贵的对象转换。
当我检索双精度数组时,我得到的是盒装java.lang.Double
数组,而不是原始双精度数组。在 parquet 阅读器代码的某处,原始数组正在转换为内存效率低的 Double 对象数组。如何防止这种昂贵的转换,并使原始双数组完好无损?我可以编写代码并将其转换回原始数组,但是已经创建了 Double 对象并且它给 VM 施加了 GC 压力。
唯一的 APIorg.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 阅读器,以便我们可以将双数组读取为原始双数组吗?
- Spark/Parquet-Hadoop Reader 是否有任何方法可以在没有自定义代码的情况下做到这一点?