使用Java API使用Spark从镶木地板读取/访问原始双精度数组

时间:2018-07-16 03:45:29

标签: scala apache-spark apache-spark-sql parquet spark-avro

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

问题:

  1. 我可以自定义Hadoop-parquet阅读器,以便将double数组读取为原始double数组吗?
  2. Spark / Parquet-Hadoop Reader是否可以在没有自定义代码的情况下执行此操作?

0 个答案:

没有答案