我有一个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;
或者这可能导致其他一些问题吗?
答案 0 :(得分:1)
如果统计数据不可用或者可能不可用或者(子)分区可能过时,那么使用LIMIT 1
更好更安全地检查数据而不是计数,因为在这种情况下count(*)
可能会导致完整(子)分区扫描。如果您使用count(*)
(set hive.compute.query.using.stats=true;
)的统计信息并且统计信息已过时,那么您将收到错误的结果。
这应该在不启动map-reduce的情况下运行,作为仅提取任务:
SELECT 1 FROM TAB_H WHERE B=1 AND C=9 limit 1;
您可以在shell脚本中包含上面的命令,分析结果。
您还可以检查文件夹是否存在。
Hive分区是分层文件夹结构。您可以使用带有hadoop fs
的shell脚本来检查文件夹是否存在,并在必要时使用hiveconf
或hivevar
变量将结果传递给Hive脚本,或者从shell有条件地执行Hive脚本。 Shell命令示例:
if $(hadoop fs -test -d $ your_sub_partition_dir);然后回声"存在&#34 ;;否则回声"不存在&#34 ;;网络
请注意,分区文件夹可能为空,分区存在但不包含任何数据。如果删除数据文件而不删除分区,则很有可能。所以第一种方法可能更合适。