स्पार्क 2.x और स्काला 2.11 के साथ
मैं विशिष्ट कॉलम के मानों को सूची में बदलने के लिए 3 संभावित तरीके सोचता हूं।
सभी दृष्टिकोणों के लिए सामान्य कोड स्निपेट
import org.apache.spark.sql.SparkSession
val spark = SparkSession.builder.getOrCreate
import spark.implicits._
val df = Seq(
("first", 2.0),
("test", 1.5),
("choose", 8.0)
).toDF("id", "val")
दृष्टिकोण १
df.select("id").collect().map(_(0)).toList
अब क्या हुआ? हम ड्राइवर के साथ डेटा एकत्र कर रहे हैं collect()
और प्रत्येक रिकॉर्ड से तत्व शून्य उठा रहे हैं।
यह इसे करने का एक उत्कृष्ट तरीका नहीं हो सकता है, आइए इसे अगले दृष्टिकोण के साथ सुधारें।
दृष्टिकोण २
df.select("id").rdd.map(r => r(0)).collect.toList
यह कैसे बेहतर है? हमने एकल चालक के बजाय श्रमिकों के बीच मानचित्र परिवर्तन भार वितरित किया है।
मुझे पता rdd.map(r => r(0))
है कि आप सुरुचिपूर्ण नहीं लगते। तो, चलिए इसे अगले दृष्टिकोण से संबोधित करते हैं।
दृष्टिकोण ३
df.select("id").map(r => r.getString(0)).collect.toList
यहां हम DataFrame को RDD में परिवर्तित नहीं कर रहे हैं। map
यह देखें कि DataFrame में एनकोडर मुद्दों के कारण पिछले दृष्टिकोण के रूप में r => r(0)
(या _(0)
) को स्वीकार नहीं किया जाएगा । तो अंत में उपयोग कर रहा है r => r.getString(0)
और यह स्पार्क के अगले संस्करणों में संबोधित किया जाएगा।
निष्कर्ष
सभी विकल्प समान आउटपुट देते हैं, लेकिन 2 और 3 प्रभावी हैं, अंत में 3 एक प्रभावी और सुरुचिपूर्ण है (मुझे लगता है)।
डेटाब्रिक्स नोटबुक