2016-02-08 9 views
9

समस्या पैदा होती है जब मैं एक DataFrame पर describe फ़ंक्शन को कॉल करें:स्पार्क 1.6: छानने का वर्णन (द्वारा उत्पन्न DataFrames)

val statsDF = myDataFrame.describe() 

समारोह का वर्णन कॉलिंग निम्नलिखित उत्पादन पैदावार:

statsDF: org.apache.spark.sql.DataFrame = [summary: string, count: string] 

मैं दिखा सकते हैं statsDF सामान्यतः statsDF.show()

+-------+------------------+ 
|summary|    count| 
+-------+------------------+ 
| count|    53173| 
| mean|104.76128862392568| 
| stddev|3577.8184333911513| 
| min|     1| 
| max|   558407| 
+-------+------------------+ 

मैं statsDF से मानक विचलन और मतलब पाने के लिए अब चाहते हैं, लेकिन जब मैं की तरह कुछ करने से मान एकत्र करने के कोशिश कर रहा हूँ:

val temp = statsDF.where($"summary" === "stddev").collect() 

मैं Task not serializable अपवाद हो रही है।

मैं भी यही अपवाद का सामना करना पड़ रहा है जब मैं फोन:

statsDF.where($"summary" === "stddev").show()

ऐसा लगता है कि हम describe() समारोह द्वारा उत्पन्न DataFrames फ़िल्टर नहीं कर सकते?

+2

मैं इसे वोट दे रहा हूं। यह अजीब है कि अब – eliasah

उत्तर

5

मैं एक खिलौना डाटासेट मैं कुछ स्वास्थ्य रोग डेटा

युक्त था पर विचार किया है
val stddev_tobacco = rawData.describe().rdd.map{ 
    case r : Row => (r.getAs[String]("summary"),r.get(1)) 
}.filter(_._1 == "stddev").map(_._2).collect 
+0

@Rami का वर्णन करके बनाई गई डीएफ पर फ़िल्टर करने में सक्षम होना यह काम करना चाहिए, सोचा कि यह थोड़ा मूर्ख और भद्दा है ... मुझे बताएं कि यह आपके लिए काम करता है या नहीं! – eliasah

+1

धन्यवाद @eliasah, यह अजीब बात है कि हम डीएफ फ़िल्टर नहीं कर सकते हैं। मैं शायद इस समस्या को स्पार्क लोगों को इंगित करने पर विचार करूंगा। – Rami

+0

@ zero323 इस मुद्दे के बारे में आप क्या सोचते हैं? क्या हमें इसके बारे में जिरा पर कोई मुद्दा खोलना चाहिए? – eliasah

2

आप dataframe से चुन सकते हैं:

from pyspark.sql.functions import mean, min, max 
df.select([mean('uniform'), min('uniform'), max('uniform')]).show() 
+------------------+-------------------+------------------+ 
|  AVG(uniform)|  MIN(uniform)|  MAX(uniform)| 
+------------------+-------------------+------------------+ 
|0.5215336029384192|0.19657711634539565|0.9970412477032209| 
+------------------+-------------------+------------------+ 

तुम भी एक मेज और क्वेरी के रूप में यह रजिस्टर कर सकते हैं तालिका:

val t = x.describe() 
t.registerTempTable("dt") 

%sql 
select * from dt 
1

एक और विकल्प होगा selectExpr() का उपयोग करने के लिए जो अनुकूलित भी करता है, उदा। न्यूनतम प्राप्त करने के लिए:

myDataFrame.selectExpr('MIN(count)').head()[0] 
संबंधित मुद्दे