python - 如何比较 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 来实现这一点。
解决方案
要进行比较,您必须始终将两个表的数据放在同一位置。
您的 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>;
. 该查询应该返回一个空行集。
祝你好运 -
推荐阅读
- android - 无法获取未知属性“localProperties”
- javascript - 反应中 ({}) 的含义是什么?
- .net - 尝试在 .NET 中创建任务列表时,我们是否需要包含 async / await 语法?
- informatica - Informatica infacmd.sh 在 Linux 上消耗高 CPU 和平均负载
- android - 如何通过单击工具栏图标Android导航到片段
- java - 从整数切割数字
- python-3.x - 张量流粗麻布 - RunTimeError
- javascript - 在映射函数中反应条件语句
- python - 多次调用后,Python 子进程模块管道停止使用 Apache Beam
- python - 将图像文件转换为 CSV 时如何添加标签?