2015-03-24 14 views
5

चिंगारी एसक्यूएल 1.2.1 में समाप्त चेतावनी के बिना, निम्नलिखित कोड (किसी भी प्रतिवाद चेतावनी के बिना) 1,3क्या यह स्पार्क 1.3 में एक रिग्रेशन बग है?

1.2.1 में काम किया में काम बंद कर दिया

val sqlContext = new HiveContext(sc) 
import sqlContext._ 
val jsonRDD = sqlContext.jsonFile(jsonFilePath) 
jsonRDD.registerTempTable("jsonTable") 

val jsonResult = sql(s"select * from jsonTable") 
val foo = jsonResult.zipWithUniqueId().map { 
    case (Row(...), uniqueId) => // do something useful 
    ... 
} 

foo.registerTempTable("...") 

1.3.0 में काम करना बंद कर (बस संकलन नहीं करता है, और सभी मैंने किया था 1.3 करने के लिए परिवर्तन किया गया)

jsonResult.zipWithUniqueId() //since RDDApi doesn't implement that method 

काम नहीं कर workar ound:

हालांकि यह मुझे दे सकता है एक RDD [पंक्ति]:

jsonResult.rdd.zipWithUniqueId() 
अब

इस RDD[Row] के रूप में काम नहीं करेगा

 foo.registerTempTable("...") 

यहाँ पाठ्यक्रम के एक registerTempTable विधि नहीं है मेरे प्रश्न हैं

  1. क्या कोई कामकाज है? (उदाहरण के लिए मैं बस यह गलत कर रहा हूँ?)
  2. यह एक बग है? (मुझे लगता है कि कुछ भी है कि संकलन है कि पिछले संस्करण में काम किया बंद हो जाता है, एक @deprecated बिना किसी चेतावनी के स्पष्ट रूप से एक प्रतिगमन बग है कि)

उत्तर

5

यह एक बग भ्रम के लिए खेद नहीं है, लेकिन! स्पार्क 1.3 तक, स्पार्क एसक्यूएल को अल्फा घटक लेबल किया गया था क्योंकि एपीआई अभी भी प्रवाह में थे। स्पार्क 1.3 के साथ हमने एपीआई स्नातक और स्थिर किया। the documentation में पोर्टिंग के दौरान आपको क्या करने की आवश्यकता है इसका पूरा विवरण।

मैं भी अपने विशिष्ट सवालों के जवाब देने और क्यों हम इन परिवर्तनों

बनाया के बारे में कुछ औचित्य दे सकते हैं

1.3.0 में काम कर (बस संकलन नहीं करता है, और सभी मैंने किया था 1.3 करने के लिए परिवर्तन किया गया) jsonResult.zipWithUniqueId() //since RDDApi doesn't implement that method रूका

डेटाफ्रेम अब स्कैला और जावा दोनों में एक एकीकृत इंटरफ़ेस हैं। हालांकि, चूंकि हमें शेष 1.X, DataFrames के लिए मौजूदा आरडीडी एपीआई के साथ संगतता बनाए रखना चाहिए RDD एस नहीं है। RDD प्रतिनिधित्व प्राप्त करने के लिए आप df.rdd या df.javaRDD

साथ ही कॉल कर सकते हैं, क्योंकि हम भ्रम की स्थिति है कि निहित रूपांतरण के साथ भी हो सकता है में से कुछ से डरते थे, हम इसे ऐसी है कि आप स्पष्ट रूप से rdd.toDF कॉल करना होगा RDD से करने के लिए रूपांतरण पैदा करने के लिए बनाया पाए जाते हैं। हालांकि, यह रूपांतरण केवल तभी काम करता है जब आपके आरडीडी में ऐसी वस्तुएं होती हैं जो Product (यानी टुपल्स या केस क्लास) से प्राप्त होती हैं।

मूल प्रश्न पर वापस जाएं, यदि आप मनमाने ढंग से स्कीमा के साथ पंक्तियों में परिवर्तन करना चाहते हैं तो आपको स्पष्ट रूप से स्पार्क एसक्यूएल को अपने मानचित्र ऑपरेशन के बाद डेटा की संरचना के बारे में स्पष्ट रूप से बताना होगा (क्योंकि संकलक नहीं कर सकता)।

import org.apache.spark.sql.types._ 
val jsonData = sqlContext.jsonRDD(sc.parallelize("""{"name": "Michael", "zip": 94709}""" :: Nil)) 
val newSchema = 
    StructType(
    StructField("uniqueId", IntegerType) +: jsonData.schema.fields) 

val augmentedRows = jsonData.rdd.zipWithUniqueId.map { 
    case (row, id) => 
    Row.fromSeq(id +: row.toSeq) 
} 

val newDF = sqlContext.createDataFrame(augmentedRows, newSchema) 
+0

धन्यवाद! मुझे लगता है मुझे पहले मैनुअल पढ़ना चाहिए था;) https: // स्पार्क।apache.org/docs/1.3.0/sql-programming-guide.html#interoperating-with-rdds –

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