我有一个Oracle表 Tab_O 及其在Hive Tab_H 中的等效表 . 两个表都根据 Part_Col 列进行分区 .
Tab_O/ Tab_H
+---+---+---+----------+-----+
| A | B | C | Part_Col | Bal |
+---+---+---+----------+-----+
| 2 | 1 | 9 | 2005 | 100 |
+---+---+---+----------+-----+
| 3 | 1 | 9 | 2005 | 400 |
+---+---+---+----------+-----+
| 3 | 2 | 8 | 2005 | 300 |
+---+---+---+----------+-----+
| 4 | 1 | 9 | 2005 | 200 |
+---+---+---+----------+-----+
Oracle表在列B和C上有子分区,例如 . B1_C9
,可以从 ALL_TABS_SUBPARTITIONS
查看 . 我根据子分区是否存在执行不同的操作 .
但我无法检查Hive中的子分区 . 那么只检查数据是否存在足够的解决方法?
SELECT COUNT(*) FROM TAB_H WHERE B=1 AND C=9;
或者这会导致其他一些问题吗?
1 回答
如果统计数据不可用或者可能不可用或者(子)分区可能过时,则使用
LIMIT 1
更好更安全地检查数据而不是计数,因为在这种情况下count(*)
可能导致完整(子)分区扫描 . 如果您使用count(*)
(set hive.compute.query.using.stats=true;
)的统计信息并且统计信息已过时,则会收到错误的结果 .这应该在不启动map-reduce的情况下运行,作为仅提取任务:
您可以在shell脚本中包含上面的命令,分析结果 .
您还可以检查文件夹是否存在 . Hive分区是分层文件夹结构 . 您可以使用带有
hadoop fs
的shell脚本来检查文件夹是否存在,并在必要时使用hiveconf
或hivevar
变量将结果传递给Hive脚本,或者从shell有条件地执行Hive脚本 . Shell命令示例:if $(hadoop fs -test -d $ your_sub_partition_dir);然后回声“存在”;否则回声“不存在”;科幻
Note that partition folder may be empty, partition exists but does not contain any data. This is quite possible if data files were deleted without dropping partition. 所以第一种方法可能更可取 .