首页 > 解决方案 > 如何比较 Hive、Teradata 之间的同一张表

问题描述

我们有一种情况,我们将相同的表复制到 Hive、Teradata 和 vertica。

我们必须测试并确认表格是否在所有人之间准确复制。

到目前为止,我们使用 python 将表格下载到 csv 并进行比较,但是由于表格的大小,我们发现这种方法存在困难。

with open('hive.csv', 'r') as t1, open('teradat.csv', 'r') as t2:
    hivedata = t1.readlines()
    teradata = t2.readlines()

with open('differences.csv', 'w') as outFile:
    for line in teradata:
        if line not in hivedata:
            outFile.write(line)

有人可以建议在给定时间比较任意两个表格的最佳方法。

我可以使用 python、spark/pyspark 来实现这一点。

标签: pythonhivecomparisonteradatavertica

解决方案


要进行比较,您必须始终将两个表的数据放在同一位置。

您的 Python 方法将两个数据库中的所有数据带到第三个位置,这是最慢的方法。

最好的办法是让所有相关人员都同意计算一个数字哈希值,在所有 Hive、Teradata 和 Vertica 中,该值将返回完全相同的整数和完全相同的表行数据。将每个平台上每个表上的所有哈希值相加,并在任何地方得到相同的结果应该足以表明数据是相同的。但是,有人可能会争辩说,您可能会遇到哈希冲突,因此这不是绝对准确的(即使哈希冲突风险非常非常低)。

如果您绝对必须比较实际的表数据 - 只需将一个表的数据带到另一个数据库。在 Vertica 中(可能是最好的选择,因为这种类型的操作在性能上可能非常令人印象深刻)CREATE TABLE cmp_<table_name> LIKE <table_name>;,然后找到将数据从其他数据库传输到 Vertica 的最快方法。在单个线程中导出到 CSV 通常不是最快的。考虑几个并行作业,每个作业都处理其表数据的子集。并考虑并行的程序,读入内存并使用该内存在非常大的数组中填充带有参数标记的 INSERT。最后,SELECT * FROM <table_name> EXCEPT SELECT * FROM cmp_<table_name>;. 该查询应该返回一个空行集。

祝你好运 -


推荐阅读