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

Mysql 在spark中连接具有重复列名的表,mysql,scala,apache-spark,apache-spark-sql,Mysql,Scala,Apache Spark,Apache Spark Sql,我正在尝试在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:字段列表中的列“id”不明确,因为两个表都有一个id字段(含义不同) 我

我正在尝试在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:字段列表中的列“id”不明确
,因为两个表都有一个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:使用列['t1.t2\u id,'t2.id]无法解决给定的输入列:[……]
似乎分析器不知道如何处理别名

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

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#528
id#570
之间的歧义,但我想不出在select语句中引用它们的任何方法。

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

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"))

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

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"))