首页 文章

Hive-检查子分区的解决方法

提问于
浏览
0

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

  • 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);然后回声“存在”;否则回声“不存在”;科幻

    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. 所以第一种方法可能更可取 .

相关问题