Можем ли мы запустить традиционный запрос соединения в spark sql - PullRequest
0 голосов
/ 11 сентября 2018

Предположим, у меня есть две таблицы: 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 голосов
/ 12 сентября 2018

Я получил вашу точку.

В опции 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 голосов
/ 12 сентября 2018

В опции 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;

0 голосов
/ 11 сентября 2018

YES.

Используя 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 - но я подозреваю, что вы тоже это знаете.

...