gpt4 book ai didi

hadoop - 设置 ORC 文件名

转载 作者:行者123 更新时间:2023-12-02 21:27:33 25 4
gpt4 key购买 nike

我目前正在实现对 HDFS 和 Hive 表的监控数据的 ETL (Talend)。
我现在面临重复的问题。更详细地说,如果我们需要使用相同的输入运行一个 ETL 作业 2 次,我们最终会在 Hive 表中出现重复项。

RDMS 中的解决方案是在发送数据之前存储输入文件名和“DELETE WHERE file name=...”。但是 Hive 不是 RDBMS,不支持删除。

我想请教您如何处理这个问题。我设想了两种解决方案:

  • 实际上,ETL 正在将 CSV 文件放入 HDFS,这些文件用于为 ORC 表提供“INSERT INTO TABLE ... SELECT ...” 问题是,通过此操作,我丢失了文件名, ORC 文件名为 00000。是否可以指定这个创建的 ORC 文件的文件名? 如果是,我将能够通过文件名搜索数据并在启动 ETL 之前将其删除。
  • 我不习惯 Hive 的 ACID 功能(Hive 0.14+ 上的功能)。 你会推荐使用 Hive 启用 ACID 吗? 我可以用它“删除哪里”吗?

  • 如果您对此有任何其他解决方案,请随时提出。

    最好的,
    奥兰多

    最佳答案

    如果目标表的数据量为不要太大 , 我会建议

    INSERT INTO TABLE trg
    SELECT ... FROM src
    WHERE NOT EXISTS
    (SELECT 1
    FROM trg x
    WHERE x.key =src.key
    AND <<additional filter on target to reduce data volume>>
    )

    Hive 将自动将相关子查询重写为 MapJoin,将目标表中的所有候选键提取到 Java HashMap 中,并即时过滤源行。只要 HashMap 可以适合 Mappers 堆大小的可用 RAM(检查您的默认 conf 文件,必要时在 Hive 脚本中使用 set 命令增加),性能将是次优的,但您可以非常确定你不会有任何重复。

    在您的实际用例中您不必检查每个键,而只需检查“批处理 ID”,更准确地说是原始文件名;我在上一份工作中的做法是
    INSERT INTO TABLE trg
    SELECT ..., INPUT__FILE__NAME as original_file_name
    FROM src
    WHERE NOT EXISTS
    (SELECT DISTINCT 1
    FROM trg x
    WHERE x.INPUT__FILE__NAME =src.original_file_name
    AND <<additional filter on target to reduce data volume>>
    )

    这意味着您的目标表中有一个额外的列,但由于 ORC 是一种列格式,因此重要的是不同值的数量——这样开销就会保持在较低水平。

    注意子查询中显式的“DISTINCT”;成熟的 DBMS 优化器会在执行时自动执行此操作,但 Hive 不会(还没有)因此您必须强制执行。另请注意,“1”只是由于“SELECT”语义而需要的虚拟值;同样,成熟的 DBMS 将允许虚拟“null”,但某些版本的 Hive 会崩溃(例如,在 V0.14 中使用 Tez),因此“1”或“'A'”更安全。

    引用:
  • https://cwiki.apache.org/confluence/display/Hive/LanguageManual+SubQueries#LanguageManualSubQueries-SubqueriesintheWHEREClause
  • https://cwiki.apache.org/confluence/display/Hive/LanguageManual+VirtualColumns
  • 关于hadoop - 设置 ORC 文件名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35427374/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com