मैं स्कैला के लिए नौसिखिया हूं और मैं एक डेटा सेट के लिए तीन के माध्यम से फिर से शुरू करना चाहता हूं और कुछ विश्लेषण करना चाहता हूं। उदाहरण के लिए मेरा डेटा नीचे जैसा है:

Sample.csv

1,100,0,NA,0,1,0,Friday,1,5
1,100,0,NA,0,1,0,Wednesday,1,9
1,100,1,NA,0,1,0,Friday,1,5
1,100,2,NA,0,1,0,Friday,1,5
1,101,0,NA,0,1,0,Friday,1,5
1,101,1,NA,0,1,0,Friday,1,5
1,101,2,NA,0,1,0,Friday,1,5
1,102,0,NA,0,1,0,Friday,1,5
1,102,1,NA,0,1,0,Friday,1,5
1,102,2,NA,0,1,0,Friday,1,5

तो अब मैं नीचे की तरह पढ़ता हूं:

val data = sc.textFile("C:/users/ricky/Data.csv")

अब मुझे पूरे डेटा के सबसेट को फ़िल्टर करने और कुछ विश्लेषण करने के लिए स्कैला में पहले तीन कॉलम के लिए फ़िल्टर लागू करने की आवश्यकता है। उदाहरण के लिए पहले तीन कॉलम फ़िल्टर किए जाने वाले कॉलम हैं। तो मेरे पास पहले कॉलम (1) के लिए एक मान है, दूसरे कॉलम के लिए 3 मान (100,101,102) और तीसरे कॉलम (0,1,2) के लिए 3 मान हैं। तो अब मुझे पूरे डेटा का सबसेट प्रदान करने के लिए फ़िल्टर चलाने की आवश्यकता है .क्या नीचे की तरह लूप का उपयोग करना अच्छा है

for {
  i <- 1
  j <- 100 to 102
  k <- 1 to 2
}

जिसे सबसेट डेटा की आवश्यकता होनी चाहिए जैसे

1,100,0,NA,0,1,0,Friday,1,5
1,100,0,NA,0,1,0,Wednesday,1,9

where i=1 ,j=100,and k=0

और अप करने के लिए

1,102,2,NA,0,1,0,Friday,1,5

where i=1 ,j=102,and k=2

मैं स्कैला में डेटा (जिसे मैं सीएसवी से पढ़ता हूं) के लिए कैसे चला सकता हूं।

0
Ricky 12 जुलाई 2017, 04:07

1 उत्तर

सबसे बढ़िया उत्तर

टेक्स्ट सीएसवी फ़ाइल से इसे पढ़ने के बाद, आप अपने इच्छित डेटा में फ़िल्टर करने के लिए filter का उपयोग कर सकते हैं

val tempData = data.map(line => line.split(","))
tempData.filter(array => array(0) == "1" && array(1) == "100" && array(2) == "0").foreach(x => println(x.mkString(",")))

यह आपको परिणाम देगा

1,100,0,NA,0,1,0,Friday,1,5
1,100,0,NA,0,1,0,Wednesday,1,9

आप बाकी मामलों के लिए भी ऐसा ही कर सकते हैं

डेटाफ़्रेम एपीआई

आप सादगी के लिए dataframe एपीआई का उपयोग कर सकते हैं, आरडीडी से अनुकूलित और कई और। पहला कदम csv को dataframe के रूप में पढ़ना होगा

val df = sqlContext.read.format("com.databricks.spark.csv").load("path to csv file")

आपके पास होगा

+---+---+---+---+---+---+---+---------+---+---+
|_c0|_c1|_c2|_c3|_c4|_c5|_c6|_c7      |_c8|_c9|
+---+---+---+---+---+---+---+---------+---+---+
|1  |100|0  |NA |0  |1  |0  |Friday   |1  |5  |
|1  |100|0  |NA |0  |1  |0  |Wednesday|1  |9  |
|1  |100|1  |NA |0  |1  |0  |Friday   |1  |5  |
|1  |100|2  |NA |0  |1  |0  |Friday   |1  |5  |
|1  |101|0  |NA |0  |1  |0  |Friday   |1  |5  |
|1  |101|1  |NA |0  |1  |0  |Friday   |1  |5  |
|1  |101|2  |NA |0  |1  |0  |Friday   |1  |5  |
|1  |102|0  |NA |0  |1  |0  |Friday   |1  |5  |
|1  |102|1  |NA |0  |1  |0  |Friday   |1  |5  |
|1  |102|2  |NA |0  |1  |0  |Friday   |1  |5  |
+---+---+---+---+---+---+---+---------+---+---+

तब आप filter api का उपयोग rdd as . में कर सकते हैं

import sqlContext.implicits._
val df1 = df.filter($"_c0" === "1" && $"_c1" === "100" && $"_c2" === "0")

आपको होना चाहिए

+---+---+---+---+---+---+---+---------+---+---+
|_c0|_c1|_c2|_c3|_c4|_c5|_c6|_c7      |_c8|_c9|
+---+---+---+---+---+---+---+---------+---+---+
|1  |100|0  |NA |0  |1  |0  |Friday   |1  |5  |
|1  |100|0  |NA |0  |1  |0  |Wednesday|1  |9  |
+---+---+---+---+---+---+---+---------+---+---+

आप कॉलम नाम रखने के लिए schema को भी परिभाषित कर सकते हैं जैसा आप चाहते हैं।

संपादित

नीचे आपकी टिप्पणी का उत्तर देना, यह सब इस बात पर निर्भर करता है कि आप क्या कहते हैं

scala> val temp = tempData.filter(array => array(0) == "1" && array(1).toInt == "100" && array(2).toInt == "0").map(x => x.mkString(","))
temp: org.apache.spark.rdd.RDD[String] = MapPartitionsRDD[12] at map at <console>:28

scala> tempData.filter(array => array(0) == "1" && array(1).toInt == "100" && array(2).toInt == "0")
res9: org.apache.spark.rdd.RDD[Array[String]] = MapPartitionsRDD[13] at filter at <console>:29

मुझे आशा है कि यह स्पष्ट है।

2
Ramesh Maharjan 12 जुलाई 2017, 05:44
मैं पहले दृष्टिकोण का उपयोग कर रहा हूं और ठीक काम करता है लेकिन मेरा डेटा आरडीडी [स्ट्रिंग] प्रकार और tempData tempData: RDD [ऐरे [स्ट्रिंग]] प्रकार है। क्या tempData को RDD [स्ट्रिंग] के रूप में रखना संभव है।
 – 
Ricky
12 जुलाई 2017, 05:19
यदि आप केवल scala> tempData.filter(array => array(0) == "1" && array(1).toInt == "100" && array(2).toInt == "0") res8: org.apache.spark.rdd.RDD[Array[String]] = MapPartitionsRDD[9] at filter at <console>:29 करते हैं तो आपको वह मिलता है जो आप चाहते हैं
 – 
Ramesh Maharjan
12 जुलाई 2017, 05:40