Skip to content

Commit 489f97b

Browse files
committed
Bug fix: TableReader.fillObject uses wrong ordinals
1 parent 97bbc4e commit 489f97b

File tree

2 files changed

+27
-29
lines changed

2 files changed

+27
-29
lines changed

sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/SpecificRow.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -171,7 +171,7 @@ final class MutableByte extends MutableValue {
171171
}
172172

173173
final class MutableAny extends MutableValue {
174-
var value: Any = 0
174+
var value: Any = _
175175
def boxed = if (isNull) null else value
176176
def update(v: Any) = value = {
177177
isNull = false

sql/hive/src/main/scala/org/apache/spark/sql/hive/TableReader.scala

Lines changed: 26 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -272,42 +272,40 @@ private[hive] object HadoopTableReader extends HiveInspectors {
272272
mutableRow: MutableRow): Iterator[Row] = {
273273

274274
val soi = deserializer.getObjectInspector().asInstanceOf[StructObjectInspector]
275-
val fieldRefsWithOrdinals = {
276-
val allFieldRefs = soi.getAllStructFieldRefs
277-
nonPartitionKeyAttrs.map { case (_, ordinal) => allFieldRefs(ordinal) -> ordinal }
278-
}
275+
val (fieldRefs, fieldOrdinals) = nonPartitionKeyAttrs.map { case (attr, ordinal) =>
276+
soi.getStructFieldRef(attr.name) -> ordinal
277+
}.unzip
279278

280279
// Builds specific unwrappers ahead of time according to object inspector types to avoid pattern
281280
// matching and branching costs per row.
282-
val unwrappers: Seq[(Any, MutableRow, Int) => Unit] =
283-
soi.getAllStructFieldRefs.map {
284-
_.getFieldObjectInspector match {
285-
case oi: BooleanObjectInspector =>
286-
(value: Any, row: MutableRow, ordinal: Int) => row.setBoolean(ordinal, oi.get(value))
287-
case oi: ByteObjectInspector =>
288-
(value: Any, row: MutableRow, ordinal: Int) => row.setByte(ordinal, oi.get(value))
289-
case oi: ShortObjectInspector =>
290-
(value: Any, row: MutableRow, ordinal: Int) => row.setShort(ordinal, oi.get(value))
291-
case oi: IntObjectInspector =>
292-
(value: Any, row: MutableRow, ordinal: Int) => row.setInt(ordinal, oi.get(value))
293-
case oi: LongObjectInspector =>
294-
(value: Any, row: MutableRow, ordinal: Int) => row.setLong(ordinal, oi.get(value))
295-
case oi: FloatObjectInspector =>
296-
(value: Any, row: MutableRow, ordinal: Int) => row.setFloat(ordinal, oi.get(value))
297-
case oi: DoubleObjectInspector =>
298-
(value: Any, row: MutableRow, ordinal: Int) => row.setDouble(ordinal, oi.get(value))
299-
case oi =>
300-
(value: Any, row: MutableRow, ordinal: Int) => row(ordinal) = unwrapData(value, oi)
301-
}
302-
}.toSeq
281+
val unwrappers: Seq[(Any, MutableRow, Int) => Unit] = fieldRefs.map {
282+
_.getFieldObjectInspector match {
283+
case oi: BooleanObjectInspector =>
284+
(value: Any, row: MutableRow, ordinal: Int) => row.setBoolean(ordinal, oi.get(value))
285+
case oi: ByteObjectInspector =>
286+
(value: Any, row: MutableRow, ordinal: Int) => row.setByte(ordinal, oi.get(value))
287+
case oi: ShortObjectInspector =>
288+
(value: Any, row: MutableRow, ordinal: Int) => row.setShort(ordinal, oi.get(value))
289+
case oi: IntObjectInspector =>
290+
(value: Any, row: MutableRow, ordinal: Int) => row.setInt(ordinal, oi.get(value))
291+
case oi: LongObjectInspector =>
292+
(value: Any, row: MutableRow, ordinal: Int) => row.setLong(ordinal, oi.get(value))
293+
case oi: FloatObjectInspector =>
294+
(value: Any, row: MutableRow, ordinal: Int) => row.setFloat(ordinal, oi.get(value))
295+
case oi: DoubleObjectInspector =>
296+
(value: Any, row: MutableRow, ordinal: Int) => row.setDouble(ordinal, oi.get(value))
297+
case oi =>
298+
(value: Any, row: MutableRow, ordinal: Int) => row(ordinal) = unwrapData(value, oi)
299+
}
300+
}
303301

304302
// Map each tuple to a row object
305303
iterator.map { value =>
306304
val raw = deserializer.deserialize(value)
307305
var i = 0
308-
while (i < fieldRefsWithOrdinals.length) {
309-
val fieldRef = fieldRefsWithOrdinals(i)._1
310-
val fieldOrdinal= fieldRefsWithOrdinals(i)._2
306+
while (i < fieldRefs.length) {
307+
val fieldRef = fieldRefs(i)
308+
val fieldOrdinal= fieldOrdinals(i)
311309
val fieldValue = soi.getStructFieldData(raw, fieldRef)
312310
unwrappers(i)(fieldValue, mutableRow, fieldOrdinal)
313311
i += 1

0 commit comments

Comments
 (0)