我正在尝试在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] can not 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#528
和id#570
之间消除歧义,但我无法弄清楚在select语句中引用它们的方法。
答案 0 :(得分:0)
我有同样的问题。我发现解决这个问题的唯一方法是在列名称上添加后缀。它看起来像这样:
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"))