冰山:如何快速穿过一张很大的table

b1zrtrql  于 2022-09-27  发布在  Hive
关注(0)|答案(1)|浏览(122)

我是冰山新手,我有一个关于查询大表的问题。
我们有一个Hive表,共有360万条记录,每条记录有120个字段。我们希望将此表中的所有记录传输到其他数据库,如pg、kafak等。
目前我们这样做:

Dataset<Row> dataset = connection.client.read().format("iceberg").load("default.table");
// here will  stuck for a very long time
dataset.foreachPartition(par ->{
    par.forEachRemaining(row ->{
       ```
    });
});

但它可能会在foreach过程中被卡住很长时间。
我尝试了以下方法,过程不会停留太久,但遍历速度很慢,遍历效率约为50条记录/秒。

HiveCatalog hiveCatalog = createHiveCatalog(props);
Table table = hiveCatalog.loadTable(TableIdentifier.of("default.table"));
CloseableIterable<Record> records = IcebergGenerics.read(table) .build();
records.forEach( record ->{
    ```
});

这两种方法都不能满足我们的需要,我想问一下我的代码是否需要修改,或者是否有更好的方法来遍历所有记录?谢谢

kiayqfof

kiayqfof1#

除了逐行阅读,这里还有另一个想法。
如果目标数据库可以直接导入文件,请尝试从Iceberg检索文件并将其直接导入数据库。
示例代码如下:

Iterable<DataFile> files = FindFiles.in(table)
        .inPartition(table.spec(), StaticDataTask.Row.of(1))
        .inPartition(table.spec(), StaticDataTask.Row.of(2))
        .collect();

您可以从DataFile获取文件路径和格式。

相关问题