2015-06-17 5 views
10

मैं स्पार्क में एक json फ़ाइल आयात किया है औरकैसे स्पार्क एसक्यूएल में हाइफन

के रूप में एक तालिका में यह convertd है के साथ स्तंभ नाम से बचने के लिए
myDF.registerTempTable("myDF") 

मैं तो इस जिसके परिणामस्वरूप मेज पर एसक्यूएल प्रश्नों चलाना चाहते हैं

val newTable = sqlContext.sql("select column-1 from myDF") 

हालांकि यह मुझे कॉलम column-1 के नाम पर हाइफ़न की वजह से त्रुटि देता है। मैं इसे स्पार्क एसक्यूएल कैसे हल करूं?

+0

कोशिश उन्हें एकल उद्धरण के साथ भागने sqlContext.sql ("का चयन करें 'कॉलम -1' myDF से") – Identity1

+2

ऐसा इसलिए है क्योंकि यह एक स्ट्रिंग नहीं एक स्तंभ नाम के रूप में 'कॉलम -1' व्यवहार करेगा काम नहीं करता। – sfactor

+0

एसक्यूएल-99 मानक निर्दिष्ट करता है कि डबल कोट (") का उपयोग पहचानकर्ताओं को सीमित करने के लिए किया जाता है। उन्हें दोहरे उद्धरणों के साथ आज़माएं, शायद बाहरी लोगों को सिंगल कोट्स में रखें – Identity1

उत्तर

29

बैकटिक (`) काम करने के लिए दिखाई देगा, इसलिए

val newTable = sqlContext.sql("select `column-1` from myDF") 

कम से कम स्पार्क v1.3.x. में, चाल करना चाहिए

+0

pyspark में भी काम करता है! – Sean

+0

yay! कोलन के लिए भी काम करता है। – Jesse

1

के रूप में मैं कम से कम 50 प्रतिनिधि

है आप struct.struct.field साथ एक json संरचना संदर्भित कर रहे हैं जब और वहाँ की तरह एक नाम स्थान मौजूद है मैं टिप्पणी नहीं कर सकता:

ns2: struct.struct.field बैकटिक्स (`) काम नहीं करता है।

jsonDF = sqlc.read.load('jsonMsgs', format="json") 
jsonDF.registerTempTable("masterTable") 
sqlc.select("select `sn2:AnyAddRq.AnyInfo.noInfo.someRef.myInfo.someData.Name` AS sn2_AnyAddRq_AnyInfo_noInfo_someRef_myInfo_someData_Name from masterTable").show() 

pyspark.sql.utils.AnalysisException: यू " 'sn2:AnyAddRq.AnyInfo.noInfo.someRef.myInfo.someData.Name'

समाधान नहीं कर पाता मैं SN2 निकालें: खेतों, क्वेरी को निष्पादित करता

मैं भी एक उद्धरण के साथ की कोशिश की है (। '), बैकस्लेश (\) और दोहरे उद्धरण चिह्नों ("")

एक ही तरीका है यह काम करता है अगर मैं SN2 पर एक और अस्थायी तालिका रजिस्टर यदि: strucutre, मैं सक्षम पहुँच क्षेत्रों के भीतर तो

०१२३५१६४१०६ की तरह कर रहा हूँ
anotherDF = jsonDF.select("sn2:AnyAddRq.AnyInfo.noInfo.someRef.myInfo.someData") 
anotherDF.registerTempTable("anotherDF") 
sqlc.select("select Name from anotherDF").show() 
1

कल एक बिट के लिए यह कम से था, बदल जाता है वहाँ (से बचने के लिए एक रास्ता है बाहर :) और एक() तो जैसे:।

केवल क्षेत्र युक्त (:) की जरूरत बैकटिक के साथ भाग जा करने के लिए

sqlc.select("select `sn2:AnyAddRq`.AnyInfo.noInfo.someRef.myInfo.someData.Name AS sn2_AnyAddRq_AnyInfo_noInfo_someRef_myInfo_someData_Name from masterTable").show() 
संबंधित मुद्दे