Spark SQL – carrega dados com o JDBC usando a instrução SQL, não o nome da tabela

Acho que estou perdendo alguma coisa, mas não consigo imaginar o que. Eu quero carregar dados usando SQLContext e JDBC usando declaração sql particular como

select top 1000 text from table1 with (nolock) where threadid in ( select distinct id from table2 with (nolock) where flag=2 and date >= '1/1/2015' and userid in (1, 2, 3) ) 

Qual método de SQLContext devo usar? Exemplos que vi sempre especificar o nome da tabela e margem inferior e superior.

Desde já, obrigado.

Você deve passar uma subconsulta válida como um argumento dbtable . Por exemplo, em Scala:

 val query = """(SELECT TOP 1000 -- and the rest of your query -- ... ) AS tmp -- alias is mandatory*""" val url: String = ??? val jdbcDF = sqlContext.read.format("jdbc") .options(Map("url" -> url, "dbtable" -> query)) .load() 

* Sub-diretório do Manual de Idiomas do Hive: https://cwiki.apache.org/confluence/display/Hive/LanguageManual+SubQueries

 val url = "jdbc:postgresql://localhost/scala_db?user=scala_user" Class.forName(driver) val connection = DriverManager.getConnection(url) val df2 = spark.read .format("jdbc") .option("url", url) .option("dbtable", "(select id,last_name from emps) e") .option("user", "scala_user") .load() 

A chave é “(select id, last_name from emps) e”, aqui você pode escrever uma subconsulta no lugar de table_name.