def accessRecord(filePath: String, recordSize: Long, offset: Long): Int = {
val fs = FileSystem.get(SparkHadoopUtil.get.conf)
val stream = fs.open(new Path(filePath))
val bytes = Array.ofDim[Byte](recordSize)
stream.readFully(offset, bytes)
stream.close()
bytes.length
}
在上面的代码中,recordSize变量作为参数传递,该参数从下面的函数之一接收值,数据类型为Long。所以它给出的错误是
error: overloaded method value ofDim with alternatives:
(n1: Int,n2: Int,n3: Int,n4: Int,n5: Int)(implicit evidence$7: scala.reflect.ClassTag[Byte])Array[Array[Array[Array[Array[Byte]]]]] <and>
(n1: Int,n2: Int,n3: Int,n4: Int)(implicit evidence$6: scala.reflect.ClassTag[Byte])Array[Array[Array[Array[Byte]]]] <and>
(n1: Int,n2: Int,n3: Int)(implicit evidence$5: scala.reflect.ClassTag[Byte])Array[Array[Array[Byte]]] <and>
(n1: Int,n2: Int)(implicit evidence$4: scala.reflect.ClassTag[Byte])Array[Array[Byte]] <and>
(n1: Int)(implicit evidence$3: scala.reflect.ClassTag[Byte])Array[Byte]
cannot be applied to (Long)
val bytes = Array.ofDim[Byte](recordSize)
^
有人可以告诉我为什么我会遇到这个错误? 提前谢谢!
答案 0 :(得分:1)
数组的最大长度由数组的固定整数长度控制。这就是ofDim
获取Int
个参数的原因,但是您在Long
中传递recordSize
(这是错误的来源和含义)。要解决此问题,您可以拨打Long.toInt
val bytes = Array.ofDim[Byte](recordSize.toInt)
或将recordSize
更改为Int
。
答案 1 :(得分:1)
因为Array.ofDim[A](size: Int)
不期望Long
。
通常,JVM上的数组总是被32位整数索引,并且它可能不会发生变化,因为它现在不可能用{{.length
替换返回类型Long
1}}不破坏一切。