假设我有两个表,table1和table2。
形成的查询类似于:select * from table1 inner join table2 on table1.id = table2.id;
现在,当我们通过此代码加载spark数据库连接时,如何提及两个表,以便可以触发联接?
参考代码
spark.read().format("jdbc").option("url", "jdbc:mysql://localhost:3306/databasename")
.option("driver", "com.mysql.jdbc.Driver")
.option("dbtable", "table1")
.option("user", "root")
.option("password", "root")
.load().createOrReplaceTempView("table1");
Dataset<Row> sql = spark.sql("select * from table1 inner join table2 on table1.id = table2.id");
我已经尝试了上面的代码,但是显示为table2 not found
。因此,可以从Spark sql触发上述查询吗?
答案 0 :(得分:0)
是。
在公共数据库上使用mysql并假设两个表都在mysql中,这是一个没有什么意义的代码段,但是有一些指针和传统的JOIN而不带内部方法,但是尽管如此,它仍能说明这一点:
val dataframe_mysql = spark.read.jdbc(jdbcUrl, s"""(select DISTINCT f1.type as f1_type, f2.type as f2_type from family f1, family f2 where f1.type like '${val1}' ) f """, connectionProperties)
其余的你都知道。
顺便说一句,您可以在mysql中使用视图-但我怀疑您也知道这一点。
答案 1 :(得分:0)
我明白了。
在dbtable选项中,您可以使用查询并加载数据框。
spark.read().format("jdbc").option("url", "jdbc:mysql://localhost:3306/databasename")
.option("driver", "com.mysql.jdbc.Driver")
.option("dbtable", s”select * from table1 inner join table2 on table1.id=table2.id")
.option("user", "root")
.option("password", "root")
.load();
确保查询通过的内容应与您的数据库内联
答案 2 :(得分:0)
在dbtable选项中,您可以使用查询,但可以使用别名并加载数据框。
Dataset<Row> load = spark.read().format("jdbc").option("url", "jdbc:mysql://localhost:3306/etl_config")
.option("driver", "com.mysql.jdbc.Driver")
.option("dbtable", "(select * from forms inner join form_entity on forms.form_id = form_entity.form_parent_id where forms.form_id = 3)tmp")
.option("user", "root")
.option("password", "root")
.load();
上述配置将解析为select * from tmp where 1=0;