java.lang.illegalargumentexception:偏移量(0)+长度(8)超过数组的容量:4

sr4lhrrt  于 2021-06-08  发布在  Hbase
关注(0)|答案(2)|浏览(581)

运行spark作业从hbase读取数据时发生此错误。谢谢。
这是密码

val hBaseRDD = sc.newAPIHadoopRDD(conf, classOf[TableInputFormat],
      classOf[org.apache.hadoop.hbase.io.ImmutableBytesWritable],
      classOf[org.apache.hadoop.hbase.client.Result])

    hBaseRDD.count()

    // transform (ImmutableBytesWritable, Result) tuples into an RDD of Result’s
    val resultRDD = hBaseRDD.map(tuple => tuple._2)
    resultRDD.count()
    // transform into an RDD of (RowKey, ColumnValue)s  the RowKey has the time removed
    val keyValueRDD = resultRDD.map(result => (Bytes.toString(result.getRow()).split(" ")(0), Bytes.toDouble(result.value)))
    keyValueRDD.take(3).foreach(kv => println(kv))

    // group by rowkey , get statistics for column value
    val keyStatsRDD = keyValueRDD.groupByKey().mapValues(list => StatCounter(list))
    keyStatsRDD.take(5).foreach(println)
dhxwm5r4

dhxwm5r41#

此错误的一个选项是存储int(4b)并试图将其读入double或long(8b)。
例如

// Write an Int
table.put(
    new Put(Bytes.toBytes(key))
        .addColumn(
            Bytes.toBytes("family"),
            Bytes.toBytes("qualifier"),
            Bytes.toBytes(1)))) // Write 1 instead of 1.0

// Attempt to read as a Double
val getResult = table.get(new Get(Bytes.toBytes(key)))
for (cell <- cells if (Bytes.toString(CellUtil.cloneQualifier(cell)) == "qualifier")) {

    val value = Bytes.toDouble(CellUtil.cloneValue(cell))
}

如果是这种情况,据我所知,可能的解决办法是:
在写入正确的类型之前强制转换
读取时,在转换为double/long之前检查值的bytes.length,如果结果为4,则转换为int

omqzjyyz

omqzjyyz2#

我遇到这个问题最多的时候就是类型错误。请仔细检查您的数据类型。

相关问题