2016-07-06 19 views
5

Ho un codice in cui ho bisogno di impostare tre tabelle. Per farlo devo chiamare la funzione jdbc tre volte per ogni tabella. Vedi codice sottoCome specificare più tabelle in Spark SQL?

val props = new Properties 
    props.setProperty("user", "root") 
    props.setProperty("password", "pass") 

val df0 = sqlContext.read.jdbc(
    "jdbc:mysql://127.0.0.1:3306/Firm42", "company", props) 

val df1 = sqlContext.read.jdbc(
    "jdbc:mysql://127.0.0.1:3306/Firm42", "employee", props) 

val df2 = sqlContext.read.jdbc(
    "jdbc:mysql://127.0.0.1:3306/Firm42", "company_employee", props) 

df0.registerTempTable("company") 
df1.registerTempTable("employee") 
df2.registerTempTable("company_employee") 

val rdf = sqlContext.sql(
    """some_sql_query_with_joins_of_various_tables""".stripMargin) 

rdf.show 

È possibile semplificare il mio codice? O forse c'è un modo per specificare più tabelle da qualche parte nella configurazione SQL.

+0

la risposta è stata di aiuto o preferisci risposte aggiuntive? – 030

risposta

2

DRY:

val url = "jdbc:mysql://127.0.0.1:3306/Firm42" 
val tables = List("company", "employee", "company_employee") 

val dfs = for { 
    table <- tables 
} yield (table, sqlContext.read.jdbc(url, table, props)) 

for { 
    (name, df) <- dfs 
} df.registerTempTable(name) 

Non hanno bisogno di frame di dati? Salta il primo ciclo:

for { 
    table <- tables 
} sqlContext.read.jdbc(url, table, props).registerTempTable(table)