我们可以在Spark SQL中触发传统的联接查询吗

时间:2018-09-11 13:49:08

标签: java apache-spark-sql

假设我有两个表,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触发上述查询吗?

3 个答案:

答案 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;