2016-09-23 10 views
11

मैंने कई एसक्यूएल प्रश्नों को कोड करने के लिए काफी समय बिताया जो पहले R स्क्रिप्ट के लिए डेटा लाने के लिए उपयोग किए जाते थे। क्यों डेटाबेस में ही इस समस्या का समाधान नहीं करता है में VIEW रों बनाने - यह है कि यह कैसेस्कैला और स्पार्क: एसक्यूएल स्टेटमेंट रीसाइक्लिंग

sqlContent = readSQLFile("file1.sql") 
sqlContent = setSQLVariables(sqlContent, variables) 
results = executeSQL(sqlContent) 

सुराग है, कि काम कुछ क्वेरी के लिए एक पूर्व क्वेरी से एक परिणाम के लिए आवश्यक है। Spark 2.0 के साथ मैं पहले से ही सिर्फ इतना है कि करने के लिए एक तरीका खोज निकाला माध्यम

// 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) 

लेकिन यह मेरी विनम्र राय में बहुत बारीकियों है। इसके अलावा, अधिक जटिल प्रश्न, उदा। पूछताछ कि वर्तमान में subquery फैक्टरिंग incooporate काम नहीं करते हैं। वहाँ की तरह एक और अधिक मजबूत तरीका है फिर से लागू करने filter($"") का उपयोग कर Spark.SQL कोड में SQL कोड, .select($""), आदि

समग्र लक्ष्य कई org.apache.spark.sql.DataFrame रों प्राप्त करने के लिए, हर एक पूर्व एसक्यूएल क्वेरी के परिणामों का प्रतिनिधित्व (जो हमेशा कुछ JOIN एस, WITH एस, आदि)। तो n प्रश्न nDataFrame एस के लिए अग्रणी हैं।

क्या प्रदान किए गए दो से बेहतर विकल्प है?

सेटअप: Hadoop v.2.7.3, स्पार्क 2.0.0, खुफिया जम्मू आईडिया 2016.2, स्काला 2.11.8, Testcluster Win7 कार्य केंद्र पर

+0

मुझे पूरी तरह से यह नहीं मिला। आपके पास एकल एसक्यूएल फ़ाइल में कई प्रश्न हैं और आप अंत में TempView के रूप में प्रत्येक क्वेरी को पंजीकृत करना चाहते हैं? या एकाधिक एसक्यूएल फाइलें, प्रत्येक एक प्रश्न के साथ और प्रत्येक क्वेरी एक TempView पंजीकरण? मुझे प्रश्न में समस्या नहीं दिख रही है। –

+0

उत्तरार्द्ध, धन्यवाद! मैंने इसे स्पष्ट करने के लिए कुछ infos जोड़ा। – Boern

+0

ठीक है, तो आप n sql फ़ाइलों से डेटाफ्रेम चाहते हैं। यह आपके द्वारा जोड़े गए कोड में पहले ही हल हो गया है। आपके समाधान में "झुकाव" क्या है, आपको "बेहतर" समाधान की आवश्यकता क्यों है - उत्तर को अनुकूलित करने के लिए क्या करना चाहिए? –

उत्तर

1

यह विशेष रूप से स्पष्ट है कि आपके आवश्यकता नहीं है, लेकिन मैं आपको लगता है कह रहे हैं आप प्रश्नों की तरह कुछ है:

SELECT * FROM people LEFT OUTER JOIN places ON ... 
SELECT * FROM (SELECT * FROM people LEFT OUTER JOIN places ON ...) WHERE age>20 

और आप घोषित करने और

SELECT * FROM people LEFT OUTER JOIN places ON ... 
SELECT * FROM <cachedresult> WHERE age>20 
के रूप में कुशलता से इस पर अमल करना चाहते हैं

यह प्राप्त करने के लिए कि मैं इनपुट फ़ाइल को बढ़ा दूंगा ताकि प्रत्येक एसक्यूएल कथन में एक संबद्ध तालिका नाम हो जिसमें परिणाम संग्रहीत किया जाएगा।

उदा।

PEOPLEPLACES\tSELECT * FROM people LEFT OUTER JOIN places ON ... 
ADULTS=SELECT * FROM PEOPLEPLACES WHERE age>18 

फिर

parseSqlFile().foreach({case (name, query) => { 
    val data: DataFrame = execute(query) 
    data.createOrReplaceTempView(name) 
} 

की तरह एक पाश में अमल सुनिश्चित करें कि आप आदेश तो सभी आवश्यक टेबल बनाया गया है में प्रश्नों की घोषणा करें। अन्य निर्भरताओं द्वारा थोड़ी अधिक पार्सिंग और सॉर्ट करें।

आरडीएमएस में मैं इन तालिकाओं को सामग्रीबद्ध दृश्यों को कॉल करता हूं। यानी एक दृश्य की तरह अन्य डेटा पर एक परिवर्तन, लेकिन परिणाम के बाद बाद में पुन: उपयोग के लिए कैश किया गया।

संबंधित मुद्दे