假设我有两个表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触发上述查询?
是。
对公共数据库使用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中使用一个视图 - 但我怀疑你也知道。
我明白了你的意思。
在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();
确保查询传递的内容应该与您的数据库内联
在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;