2

我有一个使用该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();

问题:

  1. 我可以自定义 Hadoop-parquet 阅读器,以便我们可以将双数组读取为原始双数组吗?
  2. Spark/Parquet-Hadoop Reader 是否有任何方法可以在没有自定义代码的情况下做到这一点?
4

0 回答 0