hdfs—如何从多个orc文件(通过配置单元表)中仅检索最新版本的记录,这些文件包含每个记录的多个版本?

i86rm4rw  于 2021-06-24  发布在  Hive
关注(0)|答案(1)|浏览(238)

我有下面提到的orc文件的一个表名为 EXAM_RESULTS. 这个表首先有一个初始负载,然后会有增量负载。通过增量加载产生的新记录可能会将新记录带入检查结果表或现有记录的更新版本。
前四名 ORC 文件结尾为的文件 part-m-0000000003 从文件名的日期和时间信息中可以看到来自初始加载和来自不同增量加载的数据。

-rw-r--r--   3 mysql hdfs      15808 2019-08-19 11:55 /INFO/CLASSROOM/TEST_MARKS/EXAM_RESULTS/EXAM_RESULTS_2019-08-19_11-55-49.355.orc
-rw-r--r--   3 mysql hdfs      22068 2019-08-19 12:33 /INFO/CLASSROOM/TEST_MARKS/EXAM_RESULTS/EXAM_RESULTS_2019-08-19_12-33-37.642.orc
-rw-r--r--   3 mysql hdfs      15714 2019-08-19 12:42 /INFO/CLASSROOM/TEST_MARKS/EXAM_RESULTS/EXAM_RESULTS_2019-08-19_12-42-10.203.orc
-rw-r--r--   3 mysql hdfs      20297 2019-08-19 12:52 /INFO/CLASSROOM/TEST_MARKS/EXAM_RESULTS/EXAM_RESULTS_2019-08-19_12-52-08.658.orc
-rw-r--r--   3 mysql hdfs      17082 2019-08-19 18:11 /INFO/CLASSROOM/TEST_MARKS/EXAM_RESULTS/EXAM_RESULTS_2019-08-19_18-11-53.338.orc
-rw-r--r--   3 mysql hdfs      14446 2019-08-20 07:59 /INFO/CLASSROOM/TEST_MARKS/EXAM_RESULTS/EXAM_RESULTS_2019-08-20_07-59-31.911.orc
-rw-r--r--   3 mysql hdfs      27128 2019-08-20 12:55 /INFO/CLASSROOM/TEST_MARKS/EXAM_RESULTS/EXAM_RESULTS_2019-08-20_12-55-10.985.orc
-rw-r--r--   3 hdfs   hdfs   18652678 2019-07-30 14:37 /INFO/CLASSROOM/TEST_MARKS/EXAM_RESULTS/part-m-00000
-rw-r--r--   3 hdfs   hdfs   22259778 2019-07-30 14:37 /INFO/CLASSROOM/TEST_MARKS/EXAM_RESULTS/part-m-00001
-rw-r--r--   3 hdfs   hdfs   16816786 2019-07-30 14:37 /INFO/CLASSROOM/TEST_MARKS/EXAM_RESULTS/part-m-00002
-rw-r--r--   3 hdfs   hdfs   18608955 2019-07-30 14:37 /INFO/CLASSROOM/TEST_MARKS/EXAM_RESULTS/part-m-00003

现在,我想从这个表中查询记录,这样我的 SELECT 查询输出每个记录的最新版本。
对于exmaple:existing表显示了以下信息(同时也是 SELECT * FROM TEST_MARKS.EXAM_RESULTS 查询):

Student_Name    marks_sub1  marks_sub2  marks_sub3  marks_sub4  total_marks avg_marks
 ABC            67          89          76          93          325         81.25
 XYZ            23          14          80          56          173         43.25
 PQR            50          67          98          44          259         64.75
 ABC            67          92          78          93          329         82.25
 XYZ            88          61          76          56          281         70.25

给,学生们 ABC 以及 XYZ 他们的分数更新了 PQR 数据没有变化-这些更新的记录 ABC 以及 XYZ 通过增量负载插入表中。
我想要达到的是我想要一个 SELECT 查询应该只显示每个记录的最新记录。例如,我的查询结果应该显示以下数据:

Student_Name    marks_sub1  marks_sub2  marks_sub3  marks_sub4  total_marks avg_marks
 ABC            67          92          78          93          329         82.25
 XYZ            88          61          76          56          281         70.25
 PQR            50          67          98          44          259         64.75

我不知道如何做到这一点,因为我的表中没有可以用来过滤最新数据的列。我需要使用文件名中的日期和时间信息,以便在我的文件中执行此过滤 SELECT 查询。
我对hive和hdfs完全陌生,不知道如何做到这一点。
有人能帮我吗?

iecba09b

iecba09b1#

您可以在配置单元中使用input\u file\u name虚拟列,并使用最大文件名记录。
新文件如下: EXAM_RESULTS_2019-08-20_12-55-10.985.orc 包含可排序格式的日期,并且可以对整个文件名进行排序。像这样的旧文件 part-m-00000 也可以排序,但问题是与新文件比较时 'part-m-00000'<'EXAM_RESULTS_2019-08-20_12-55-10.985.orc' = false . 我提议撤职 part-m- 从文件名进行排序,以便以适当的方式进行排序,所以 '00000'< 'EXAM_RESULTS_2019-08-20_12-55-10.985.orc' . 这样就可以使用 row_number 要查找最新记录:

select Student_Name    marks_sub1  marks_sub2  marks_sub3  marks_sub4  total_marks avg_marks
from 
(
select e.*, row_number() over(partition by Student_Name order by filename desc) rn
from
(select regexp_replace(INPUT__FILE__NAME,'part-m-','') filename, e.* from TEST_MARKS.EXAM_RESULTS e )e
)s
where rn=1;

相关问题