Spędziłem sporo czasu, aby zakodować wiele zapytań SQL, które były wcześniej używane do pobierania danych dla różnych skryptów R
. Jak to działaScala & Spark: Recykling instrukcji SQL
sqlContent = readSQLFile("file1.sql")
sqlContent = setSQLVariables(sqlContent, variables)
results = executeSQL(sqlContent)
Kluczem jest to, że dla niektórych zapytań wynika z uprzedniego zapytania jest wymagane - dlaczego tworzenie VIEW
s w bazie sama nie rozwiązuje tego problemu. Z Spark 2.0
już zorientowali się sposób to zrobić tylko, że przez
// create a dataframe using a jdbc connection to the database
val tableDf = spark.read.jdbc(...)
var tempTableName = "TEMP_TABLE" + java.util.UUID.randomUUID.toString.replace("-", "").toUpperCase
var sqlQuery = Source.fromURL(getClass.getResource("/sql/" + sqlFileName)).mkString
sqlQuery = setSQLVariables(sqlQuery, sqlVariables)
sqlQuery = sqlQuery.replace("OLD_TABLE_NAME",tempTableName)
tableDf.createOrReplaceTempView(tempTableName)
var data = spark.sql(sqlQuery)
Ale to moim skromnym zdaniem bardzo skomplikowanego. Również bardziej złożone zapytania, np. zapytania, które obecnie nie działają w przypadku incooporate subcompery. Czy jest bardziej solidny sposób jak re-implementacji kodu SQL w kod Spark.SQL
użyciu filter($"")
, .select($"")
itp
Ogólnym celem jest uzyskanie wielu org.apache.spark.sql.DataFrame
S, każda reprezentująca wyniki jednego zapytania byłego SQL (który zawsze kilka: JOIN
s, WITH
s itp.). Tak więc zapytania o numer n
prowadziły do n
DataFrame
.
Czy istnieje lepsza opcja niż podane dwa?
Setup: Hadoop v.2.7.3
, Spark 2.0.0
, Intelli J IDEA 2016.2
, Scala 2.11.8
, Testcluster na Win7 Workstation
Nie w pełni to rozumiem. Masz wiele zapytań w jednym pliku sql i chcesz, aby każde zapytanie zostało zarejestrowane jako TempView na końcu? Lub wiele plików sql, każdy z jednym zapytaniem i każde zapytanie rejestrujące jeden TempView? Nie widzę problemu w pytaniu. –
Te ostatnie, dzięki! Dodałem kilka informacji, aby to wyjaśnić. – Boern
Ok, więc chcesz n DataFrames z n plików sql. Zostało to rozwiązane już w kodzie, który dodałeś. Co to jest "fiddly" w twoim rozwiązaniu, dlaczego potrzebujesz "lepszego" rozwiązania - co powinna zoptymalizować odpowiedź? –