一、作用
虚拟列是Hive
内置的可以在查询语句中使用的特殊标记,可以查询数据本身的详细参数
。
Hive
目前可用3个虚拟列
:
INPUT__FILE__NAME
:显示数据行所在的具体文件BLOCK__OFFSET__INSIDE__FILE
:显示数据行所在文件的偏移量ROW__OFFSET__INSIDE__BLOCK
:显示数据所在HDFS
块的偏移量
此虚拟列需要设置:SET hive.exec.rowoffset=true
才可使用
二、实操
INPUT__FILE__NAME
:通过这个虚拟列,我们可以确定数据所在文件位置(HDFS
中的位置)
sql
SET hive.exec.rowoffset=true
SELECT orderid , INPUT__FILE__NAME, BLOCK__OFFSET__INSIDE__FILE, ROW__OFFSET__INSIDE__BLOCK FROM itheima.orders o ;
BLOCK__OFFSET__INSIDE__FILE
:偏移量,就是每条数据,在文件中的起始index
下标。
比如上图的第302
条数据,显示,165
。
这里我用Java
程序验证一下order2.txt
文件的偏移量:
代码
java
package com.atguigu.mapreduce.test;
import java.io.IOException;
import java.io.RandomAccessFile;
public class FileOffsetReader {
public static void main(String[] args) {
String filePath = "C:\\Users\\admin\\Desktop\\orders\\order2.txt";
int offset = 0; // 指定偏移量
try (RandomAccessFile file = new RandomAccessFile(filePath, "r")) {
// 将文件指针移动到指定偏移量
while (true && offset<=200){
file.seek(offset);
int ch = file.read(); // 读取偏移量处的字符(或使用readByte()读取字节)
if (ch != -1) {
System.out.println("字符偏移量 " + offset + " 处的字符: " + (char) ch);
offset++;
} else {
System.out.println("已到达文件末尾");
break;
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
偏移量,就是行数据的起始下标。
注意,一个中文占据3个偏移量数值,所以,偏移量和string length的含义还是有所不同!
ROW__OFFSET__INSIDE__BLOCK
:数据块偏移量
即可以通过该字段,查看数据所在HDFS中块的信息。
三、总结
三个虚拟字段都很实用。
我们如果发现数据有问题,可以通过这三个字段,定位到HDFS
中数据的具体位置。从而,进行问题溯源。