2016-03-08 5 views
18

में मैं SQL जैसी IN खंड के साथ एक Pyspark DataFrame फ़िल्टर करना चाहते हैं एक Pyspark DataFrame फ़िल्टर करना, साथ SQL जैसी खंड

sc = SparkContext() 
sqlc = SQLContext(sc) 
df = sqlc.sql('SELECT * from my_df WHERE field1 IN a') 

जहां a टपल (1, 2, 3) है के रूप में।

java.lang.RuntimeException: [1.67] failure: ``('' expected but identifier a found

जो मूल रूप से कह रहा है यह की तरह कुछ उम्मीद कर रहा था '(1, 2, 3)' एक के बजाय: मैं इस त्रुटि हो रही है। समस्या यह है कि मैं मूल्यों को मैन्युअल रूप से लिख नहीं सकता क्योंकि यह किसी अन्य नौकरी से निकाला गया है।

मैं इस मामले में कैसे फ़िल्टर करूं?

उत्तर

34

स्ट्रिंग आप SQLContext पर पास करते हैं, यह SQL वातावरण के दायरे में मूल्यांकन किया जाता है। यह बंद नहीं है। आप एक चर पास करना चाहते हैं तो आप इसे स्पष्ट रूप से करने के लिए स्ट्रिंग स्वरूपण का उपयोग कर होगा: यह कुछ आप सुरक्षा विचारों की वजह से एक 'असली' एसक्यूएल वातावरण में प्रयोग करेंगे नहीं है

df = sc.parallelize([(1, "foo"), (2, "x"), (3, "bar")]).toDF(("k", "v")) 
df.registerTempTable("df") 
sqlContext.sql("SELECT * FROM df WHERE v IN {0}".format(("foo", "bar"))).count() 
## 2 

जाहिर है, लेकिन यह नहीं करना चाहिए यहाँ मामला

from pyspark.sql.functions import col 

df.where(col("v").isin({"foo", "bar"})).count() 
## 2 

यह निर्माण और रचना के लिए आसान है और आप के लिए HiveQL/स्पार्क एसक्यूएल के सभी विवरण संभालता है:

जब आप गतिशील प्रश्नों बनाना चाहते हैं व्यवहार में DataFrame डीएसएल एक बहुत पसंद है।

+0

दूसरी विधि के लिए, आप ऐसा करके ही प्राप्त कर सकते हैं हम भी (न केवल set) की तरह एक सूची का उपयोग कर एक ही बात कर सकते हैं df.where (df.v.isin ({"foo", "bar"}))। गिनती() –

+3

आप कर सकते हैं, लेकिन व्यक्तिगत रूप से मुझे यह दृष्टिकोण पसंद नहीं है। 'Col' के साथ मैं आसानी से एसक्यूएल अभिव्यक्ति और विशेष' डेटाफ्रेम 'ऑब्जेक्ट को कम कर सकता हूं। तो आप उदाहरण के लिए उपयोगी अभिव्यक्तियों का एक शब्दकोश रख सकते हैं और जब आपको आवश्यकता हो तो उन्हें चुनें। स्पष्ट डीएफ ऑब्जेक्ट के साथ आपको इसे एक फ़ंक्शन के अंदर रखना होगा और यह अच्छी तरह से लिख नहीं सकता है। – zero323

12

दोहराते क्या @ zero323 ऊपर उल्लेख किया गया है: नीचे

from pyspark.sql.functions import col 

df.where(col("v").isin(["foo", "bar"])).count() 
संबंधित मुद्दे