我们可以在spark sql中触发传统的连接查询吗?

问题描述 投票:0回答:3

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

java apache-spark-sql
3个回答
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中使用一个视图 - 但我怀疑你也知道。


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();

确保查询传递的内容应该与您的数据库内联


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;

© www.soinside.com 2019 - 2024. All rights reserved.