use*_*066 5 hash teradata pyspark
我正在对来自 Teradata 数据库的数据执行增量加载并将其存储为 parquet 文件。由于 Teradata 中的表包含数十亿行,因此我希望 PySpark 脚本能够比较哈希值。
Teradata 表: Teradata 中的示例表
当前存储的 Parquet 文件: 存储在 Parquet 文件中的数据
我的 PySpark 脚本使用 JDBC 读取连接来调用 teradata:
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")
Run Code Online (Sandbox Code Playgroud)
Spark 脚本读取镶木地板:
myDF = spark.read.parquet("myParquet")
myDF.createOrReplaceTempView("myDF")
spark.sql("select * from myDF").show()
Run Code Online (Sandbox Code Playgroud)
我怎么能够:
小智 1
您想要插入新行,或者,如果存在具有标识信息的行,则更新它们。这称为“更新插入”或在 teradata 中称为“合并”。
这取决于哪些列允许更改以及哪些列使行成为“新”行。
在你的例子中你有:
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
Run Code Online (Sandbox Code Playgroud)
因此,如果任何名称、帐户组合应该是唯一的,则数据库表应该为其定义唯一的键。
这样,数据库将不允许插入具有相同唯一键的另一行,但允许您更新它。
因此,根据这个示例,使用示例数据,您的 sql 命令将如下所示:
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');
Run Code Online (Sandbox Code Playgroud)
但这是一种非常简单的方法,效果可能很差。
谷歌搜索“teradata批量上传”可以找到诸如
可能还有很多其他的。