gpt4 book ai didi

mysql - 在 spark 中连接具有重复列名的表

转载 作者:行者123 更新时间:2023-11-30 22:06:34 26 4
gpt4 key购买 nike

我正在尝试在 spark 上连接多个 MySQL 表。其中一些表具有重复的列名(每个表都有一个特定于该表的 id 字段)。

如果我尝试运行:

val myDF = session.read.jdbc("t1 inner join t2 on t1.t2_id = t2.id, queryTable, prop)
myDF.show

我得到 java.sql.SQLIntegrityConstraintViolationException: Column 'id' in field list is ambiguous 因为两个表都有一个 id 字段(具有不同的含义)

我试过:

val t1DF = spark.read.jdbc(dbstring, "t1", "id").alias("a")
val t2DF = spark.read.jdbc(dbstring, "t2", "id").alias("b")
val joinedDF = t1DF.join(t2DF, Seq("a.t2_id", "b.id"))
.selectExpr("ent.id as entity_id", "lnk.pagerank")

我收到错误 org.apache.spark.sql.AnalysisException: using columns ['t1.t2_id,'t2.id] cannot be resolved given input columns: [..] 它看起来分析器不知道如何处理别名。

唯一可行的方法是使用子查询:

spark.read.jdbc(dbstring, "(select t1.id as t1_id, t1.t2_id from 
t1 inner join t2 on t1.t2_id = t2.id) t", "t2_id")

虽然在那种情况下,子查询需要先完成运行,然后我才能执行任何过滤器,这会使速度慢得令人无法接受,并且任何查询分区都无用。

Spark 似乎有一些内部方法来消除 id 的 id#528id#570 之间的歧义,但我想不出任何引用它们的方法在选择语句中。

最佳答案

我遇到了同样的问题。我发现解决这个问题的唯一方法是在列名上添加后缀。它看起来像这样:

val t1DF = spark.read.jdbc(dbstring, "t1", "id").select(col("id").alias("id_t1"))
val t2DF = spark.read.jdbc(dbstring, "t2", "id").select(col("id").alias("id_t2"))

val joinedDF = t1DF.join(t2DF, t1DF("id_t1") === t2DF("id_t2"))

关于mysql - 在 spark 中连接具有重复列名的表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41515428/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com