Hive-检查子分区

时间:2017-05-22 06:10:35

标签: oracle hadoop hive

我有一个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 个答案:

答案 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脚本来检查文件夹是否存在,并在必要时使用hiveconfhivevar变量将结果传递给Hive脚本,或者从shell有条件地执行Hive脚本。 Shell命令示例:

if $(hadoop fs -test -d $ your_sub_partition_dir);然后回声"存在&#34 ;;否则回声"不存在&#34 ;;网络

请注意,分区文件夹可能为空,分区存在但不包含任何数据。如果删除数据文件而不删除分区,则很有可能。所以第一种方法可能更合适。