首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Teradata和Spark中的相似哈希算法

Teradata和Spark中的相似哈希算法
EN

Stack Overflow用户
提问于 2019-01-16 03:07:56
回答 1查看 170关注 0票数 5

我正在对来自Teradata数据库的数据执行增量加载,并将其存储为一个拼花文件。因为Teradata中的表包含数十亿行,所以我希望我的PySpark脚本能够比较哈希值。

Teradata:Teradata中的示例表

当前存储的Parquet文件:存储在拼花文件中的数据

我的PySpark脚本使用JDBC连接来调用teradata:

代码语言:javascript
复制
tdDF = return spark.read \
  .format("jdbc") \
  .option("driver", "com.teradata.jdbc.TeraDriver") \
  .option("url", "jdbc:teradata://someip/DATABASE=somedb,MAYBENULL=ON") \
  .option("dbtable", "(SELECT * FROM somedb.table)tmp")

在地板上读的火花脚本:

代码语言:javascript
复制
myDF = spark.read.parquet("myParquet")
myDF.createOrReplaceTempView("myDF")
spark.sql("select * from myDF").show()

我如何才能:

  • 在我对teradata的调用中包含一个散列函数,该函数返回整个行值的散列(这个哈希函数应该在Teradata上执行)
  • 当读取返回整个行值的散列时,在我的PySpark代码中包含一个哈希函数(这个哈希函数应该在Spark中执行)
  • 比较这两个散列,看看哪个是需要加载的Teradata中的增量。
EN

回答 1

Stack Overflow用户

发布于 2022-08-07 19:05:57

您希望插入新行,或者,如果存在标识信息的行,则更新它们。这被称为'upsert‘,或在teradata中称为“合并”

这取决于哪些列可以更改,哪些列可以“新建”。

在你的例子中,你有:

代码语言:javascript
复制
terradata

    Name   Account  Product
    ------+--------+---------
    Sam    1234     Speakers
    Jane   1256     Earphones
    Janet  3214     Laptop
    Billy  5678     HardDisk

parquet

    Name   Account  Product
    ------+--------+---------
    Sam    1234     Speakers
    Jane   1256     Earphones

因此,如果任何名称,帐户组合应该是唯一的,数据库表应该有一个唯一的键为它定义。

这样,数据库将不允许使用相同的唯一键插入另一行,但将允许您更新它。

因此,以这个例子为例,使用示例数据,您的sql命令如下所示:

代码语言:javascript
复制
UPDATE somedb.table SET product = 'Speakers' WHERE name = 'Sam' AND account = 1234 ELSE INSERT INTO somedb.table(name, account, product) VALUES('Sam',1234,'Speakers');
UPDATE somedb.table SET product = 'Earphones' WHERE name = 'Jane' AND account = 1256 ELSE INSERT INTO somedb.table(name, account, product) VALUES('Jane',1256,'Earphones');
UPDATE somedb.table SET product = 'Laptop' WHERE name = 'Janet' AND account = 3214 ELSE INSERT INTO somedb.table(name, account, product) VALUES('Janet',3214,'Laptop');
UPDATE somedb.table SET product = 'HardDisk' WHERE name = 'Billy' AND account = 5678 ELSE INSERT INTO somedb.table(name, account, product) VALUES('Billy',5678,'HardDisk');

但这是一种非常简单的方法,很可能效果很差。

Googleing 'teradata‘查找链接,如

可能还有很多其他的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54209876

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档