2015-03-29 6 views
5

नीचे मेरी स्पार्क एसक्यूएल स्क्रिप्ट है जो फ़ाइल लोड करती है और इसके ऊपर एसक्यूएल का उपयोग करती है, मैं एसक्यूएल क्वेरी से आउटपुट एकत्र करना चाहता हूं और इसे एक फाइल में लिखना चाहता हूं, यह सुनिश्चित नहीं कर सकता कि कोई भी मदद कैसे कर सकता है।एक फ़ाइल में स्पार्क एसक्यूएल आउटपुट कैसे एकत्रित करें?

//import classes for sql 
 
import org.apache.spark.sql.SQLContext 
 
import org.apache.spark.{SparkConf, SparkContext} 
 

 
val sqlContext = new org.apache.spark.sql.SQLContext(sc) 
 

 
// createSchemaRDD is used to implicitly convert an RDD to a SchemaRDD. 
 
import sqlContext.createSchemaRDD 
 

 

 
//hdfs paths 
 
val warehouse="hdfs://quickstart.cloudera/user/hive/warehouse/" 
 
val customers_path=warehouse+"people/people.txt" 
 
customers_path 
 

 
//create rdd file called file 
 
val file=sc.textFile(customers_path) 
 

 
val schemaString="name age" 
 

 
import org.apache.spark.sql._ 
 

 

 

 
val schema = 
 
    StructType(
 
    schemaString.split(",").map(fieldName => StructField(fieldName, StringType, true))) 
 

 
val rowRDD=file.map(_.split(",")).map(p => Row(p(0),p(1).trim)) 
 

 
val peopleSchemRDD=sqlContext.applySchema(rowRDD, schema) 
 

 
// Register the SchemaRDD as a table. 
 
peopleSchemRDD.registerTempTable("people") 
 

 
// SQL statements can be run by using the sql methods provided by sqlContext. 
 
sqlContext.sql("select count(*) from people").collect().foreach(println) 
 
System.exit(0)

+0

कोड में आपने परिणाम दिया है क्वेरी सिर्फ एक संख्या है, है ना? आप पूछ रहे हैं कि स्कैला में एक फाइल को कैसे लिखना है? –

+0

हाँ, मैं चाहता हूं कि फ़ाइल में नंबर या आउटपुट लिखा जाए, क्या ऐसा करने का कोई तरीका है? –

+0

val op = sqlContext.sql ("लोगों से गिनती (*) का चयन करें") वैल सी = op.collect() वैल rdd = sc.parallelize (सी) rdd.saveAsTextFile ("/ home/cloudera/op") System.exit (0) –

उत्तर

4

तुम सिर्फ HDFS पर एक बड़ा फ़ाइल की पंक्तियों की संख्या की गणना और यह एक और फाइल करने के लिए लिखना चाहते हैं:

import java.nio.file.{ Files, Paths } 
val path = "hdfs://quickstart.cloudera/user/hive/warehouse/people/people.txt" 
val rdd = sc.textFile(path) 
val linesCount = rdd.count 
Files.write(Paths.get("line_count.txt"), linesCount.toString.getBytes) 
0

//import classes for sql 
 
import sqlContext.implicits._ 
 
import org.apache.spark.sql.SQLContext 
 
import org.apache.spark.{SparkConf, SparkContext} 
 

 
val sqlContext = new org.apache.spark.sql.SQLContext(sc) 
 

 
// createSchemaRDD is used to implicitly convert an RDD to a SchemaRDD. 
 
import sqlContext.createSchemaRDD 
 
import sqlContext.implicits._ 
 

 
//hdfs paths 
 
val warehouse="hdfs://quickstart.cloudera/user/hive/warehouse/" 
 
val customers_path=warehouse+"people/people.txt" 
 
customers_path 
 

 
//create rdd file called file 
 
val file=sc.textFile(customers_path) 
 

 
val schemaString="name age" 
 

 
import org.apache.spark.sql._ 
 

 

 

 
val schema = 
 
    StructType(
 
    schemaString.split(",").map(fieldName => StructField(fieldName, StringType, true))) 
 

 
val rowRDD=file.map(_.split(",")).map(p => Row(p(0),p(1).trim)) 
 

 
val peopleSchemRDD=sqlContext.applySchema(rowRDD, schema) 
 

 
// Register the SchemaRDD as a table. 
 
peopleSchemRDD.registerTempTable("people") 
 

 
// SQL statements can be run by using the sql methods provided by sqlContext. 
 
val op=sqlContext.sql("select count(*) from people") 
 
val c=op.collect() 
 
val rdd=sc.parallelize(c) 
 
rdd.saveAsTextFile("/home/cloudera/op") 
 
System.exit(0)

+2

फ़ाइल लिखने के लिए केवल 1-तत्व आरडीडी बनाने का कोई कारण नहीं है। –

संबंधित मुद्दे